gpt4 book ai didi

c++ - 为什么将字符串文字传递给 char* 参数有时只是编译器错误?

转载 作者:可可西里 更新时间:2023-11-01 18:09:50 25 4
gpt4 key购买 nike

我在 C 和 C++ 程序中工作。我们曾经在没有 make-strings-writable 选项的情况下进行编译。但那会收到一堆警告,所以我将其关闭。

然后我收到一大堆错误,格式为“无法将 const char* 转换为 char* in argmuent 3 of function foo”。所以,我经历了很多改变来解决这些问题。

然而,今天,程序崩溃了,因为文字“”被传递到一个需要 char* 的函数中,并将第 0 个字符设置为 0。它没有做任何坏事,只是试图编辑一个不断,崩溃。

我的问题是,为什么这不是编译器错误?

以防万一,这是在用 gcc-4.0 编译的 mac 上。

编辑:添加代码:

char * host = FindArgDefault("EMailLinkHost", "");
stripCRLF(linkHost, '\n');

哪里:

char *FindArgDefault(char *argName, char *defVal) 
{// simplified
char * val = defVal;
return(val);
}

void stripCRLF(char *str, char delim)
{
char *p, *q;

for (p = q = str; *p; ++p) {
if (*p == 0xd || *p == 0xa) {
if (p[1] == (*p ^ 7)) ++p;
if (delim == -1) *p = delim;
}
*q++ = *p;
}
*q = 0; // DIES HERE
}

编译并运行直到它试图将 *q 设置为 0...

编辑 2:

大多数人似乎都忽略了我问题的重点。我知道为什么 char foo[] = "bar"有效。我知道为什么 char * foo = "bar";不起作用。

我的问题主要与传递参数有关。我想到的一件事是“这可能是 C vs C++ 的问题吗?”因为我有一些 .c 文件和一些 .cpp 文件,C 很可能允许它,但 C++ 不允许……反之亦然……

最佳答案

该标准指定了一个特殊规则,允许文字到 char* 的转换,这悄悄地删除了 const 资格。 (4.2/2):

A string literal (2.13.4) that is not a wide string literal can be converted to an rvalue of type “pointer to char”; a wide string literal can be converted to an rvalue of type “pointer to wchar_t”. In either case, the result is a pointer to the first element of the array. This conversion is considered only when there is an explicit appropriate pointer target type, and not when there is a general need to convert from an lvalue to an rvalue. [Note: this conversion is deprecated. See Annex D. ]

C++0x 标准进一步弃用了......这条无意义的规则已从即将发布的标准中完全删除。

const char*char* 的错误必须是首先将文字转换为 const char* 的结果。

关于c++ - 为什么将字符串文字传递给 char* 参数有时只是编译器错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2760500/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com