gpt4 book ai didi

c++ - c中 ""的确切返回值是什么?它是一个指针吗?

转载 作者:行者123 更新时间:2023-11-30 21:31:53 25 4
gpt4 key购买 nike

我知道“Ali”是一个有4个字符的字符数组:'A' 'l' 'i' NULL

我想知道的是它的返回值。

例如 strcpy 需要两个指针作为输入。为什么下面的代码可以工作:

    char mstr[10]={};
strcpy(mstr,"Working...");

但这不是:

    char *names[5]={"Ali","Reza","Hassan","Ahmad","Mohammad"};

“Ali”是否是指向“A”字符的指针?!

<小时/>

问题已解决!!! (我不明白为什么?!我只是添加一些东西来打印它们!):

#include <stdio.h>
#include <conio.h>
#include <string.h>


int main()
{
char mstr[10]={};
strcpy(mstr,"Working...");
char *names[5]={"Ali","Reza","Hassan","Ahmad","Mohammad"};
int i;
//print :
for(i=0;i<5;i++)
{
puts(names[i]);
}

getch();
return 0;
}
<小时/>

我想我知道这里发生了什么。我的第二个代码在 C 中是完全正确的。我将其编译为 c++ 文件(它是一个 cpp 文件)

顺便说一句,错误是:[错误]从“char”到“const char*”的无效转换[-fpermissive]

C++ 有不同的规则,默认情况下它定义了 5 个 const char 数组而不是 char 数组。

我认为这就是答案。

最佳答案

在 C 语言中,这个声明:

char *names[5]={"Ali","Reza","Hassan","Ahmad","Mohammad"};

完全合法,但有潜在危险。它将 names 定义为由 5 个 char* 指针组成的数组,每个指针都指向字符串文字的第一个字符。问题在于尝试修改字符串文字具有未定义的行为(由于历史原因,字符串文字不是 const)。所以这个声明允许你做类似的事情:

names[0][0] = 'E'; /* rename Ali to Eli? */

编译器没有提示;它可能会在执行过程中崩溃。 (允许但不要求编译器对此发出警告。)

上面应该写成:

const char *names[5]={"Ali","Reza","Hassan","Ahmad","Mohammad"};

这使得names成为一个由5个指向const(只读)char的指针组成的数组。

至于为什么代码不适合您,这是因为您尝试将其编译为 C++(您仅在评论中提到)。 C++ 是一种与 C 不同的语言,并且具有不同的规则。 (在 C++ 中,允许转换,但不推荐使用。)如果您想询问有关 C++ 的问题,请使用 C++ 标签发布一个新问题 - 并确保在问题正文中清楚地显示确切的错误消息,而不是隐藏在其中一条评论。

关于c++ - c中 ""的确切返回值是什么?它是一个指针吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20745975/

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