这个例子应该如何工作?它对我来说是错误的
Posted
技术标签:
【中文标题】这个例子应该如何工作?它对我来说是错误的【英文标题】:How is this example supposed to work? It errors for me 【发布时间】:2021-05-07 23:55:31 【问题描述】:我在https://en.cppreference.com/w/c/string/byte/strcpy找到了这个例子
#define __STDC_WANT_LIB_EXT1__ 1
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
int main(void)
char *src = "Take the test.";
// src[0] = 'M' ; // this would be undefined behavior
char dst[strlen(src) + 1]; // +1 to accomodate for the null terminator
strcpy(dst, src);
dst[0] = 'M'; // OK
printf("src = %s\ndst = %s\n", src, dst);
#ifdef __STDC_LIB_EXT1__
set_constraint_handler_s(ignore_handler_s);
int r = strcpy_s(dst, sizeof dst, src);
printf("dst = \"%s\", r = %d\n", dst, r);
r = strcpy_s(dst, sizeof dst, "Take even more tests.");
printf("dst = \"%s\", r = %d\n", dst, r);
#endif
使用 nvcc 编译器,我在char dst[strlen(src) + 1];
“表达式必须有一个常量值”这一行得到一个错误。
使用 Visual C++,我得到了那个错误和另一个错误,“C++ 类型的值不能用于初始化类型的实体”,位于 char *src = "Take the test.";
行上
如果我在网站上编译并运行它,就可以了。
【问题讨论】:
你举的例子是C,不是C++。 这是标记为 C++,看起来您正在尝试使用 C++ 编译器,但您正在链接到 C 文档中的代码 sn-p。 C 和 C++ 不是同一种语言,并非所有有效的 C 都是有效的 C++。 无论如何,您看到的两个特定错误都与 C 和 C++ 有关,在 whether variable-length arrays are permitted 和 whether you can assign a string literal to a char* 上有所不同。 所以我不能使用nvcc?还是 Visual C++ 编译一个 .c 文件? 我不知道 nvcc 但是 Visual C++ 官方不支持很多 C 特性,例如你需要的这些。 【参考方案1】:此功能称为“灵活数组成员”或在某些情况下称为“可变长度数组”。从 'c99' 标准开始的 'c' 支持它。 gcc 和 microsoft 'c' 在标准之前也支持它。
c++ 一般不支持此功能。在 c++14 中添加了一些支持,需要将简单表达式作为数组索引。
因此,您可以使用支持 c99 或更高标准的“c”编译器来编译它。在编译命令行中也可能需要一些特定的限定符。
以可移植的方式解决它的最简单方法是使用 malloc 的动态数组分配:
char *dst = malloc(strlen(src) + 1);
strcpy(dst, src);
以后用strlen(dst)
代替sizeof dst
;
【讨论】:
以上是关于这个例子应该如何工作?它对我来说是错误的的主要内容,如果未能解决你的问题,请参考以下文章
使用 PHP 7 显示自定义错误页面 - 对我来说是详细信息,对用户来说是通用的