这个例子应该如何工作?它对我来说是错误的

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 显示自定义错误页面 - 对我来说是详细信息,对用户来说是通用的

如何在 Spring MVC 中管理错误消息

OpenCL - clCreateBuffer大小错误。可能的工作?

如何检查 SOCKS 服务器是不是正常工作?

Android计费库错误

NotORM 的连接与多选