c - 为什么下面的代码片段分配会产生令人困惑的输出?

标签 c arrays string

我正在学习 C。我遇到了字符串数组。我对以下代码有点困惑。我期待一种输出;然而,由于读取访问冲突而获得完全不同类型的输出或程序崩溃。

我已在 Visual Studio 2017 上运行此代码,并出现 _CRT_SECURE_NO_WARNINGS

// case 1

char* name[2];
//name[0] = (char*)malloc(sizeof(char*) * 10); 
//name[1] = (char*)malloc(sizeof(char*) * 10);
name[0] = "john";
name[1] = 'doe';
printf("%s\n", name[0]); // prints john
//printf("%s\n", name[1]); // gives read access violation exception, why??? even with dynamically allocated memory

// case 2

char* name2[2] = { "emma", "olsson" };
printf("%s\n", name2[0]); // prints emma
printf("%s\n", name2[1]); // prints olsson, why no error???

// case 3

for (int i = 0; i < 2; i++)
{
    name[i] = name2[i];
}
printf("%s\n", name[0]); // prints emma
printf("%s\n", name[1]); // prints olsson, why no error??? 

// case 4

char inputName[10];
int i = 0; 
while (i < 2)
{
fgets(inputName, sizeof(inputName), stdin); // first input: Max   second input: Payne
char* pos = strchr(inputName, '\n');
if (pos != NULL)
    *pos = '\0';
name[i++] = inputName;
}
printf("%s\n", name[0]); // prints Payne, why not Max???
printf("%s\n", name[1]); // prints Payne

最佳答案

对于情况 1,“doe”不是字符串。

情况 2 有效,因为您正在使用字符串文字初始化指针。

情况 3 也适用,因为您将情况 2 中相同的初始化指针分配给情况 1 指针。您的 name 数组指针基本上设置为指向 name2 指针所指向的位置。

在情况 4 中,您声明了指向一组 10 个字符的 inputName。然后,每次获得新输入时,都会将其写入同一内​​存部分。通过这样做:name[i++] = inputName; 您没有像您想象的那样将新的 char 数组复制到 name[i] 。相反,您告诉 name[i] char 指针指向 inputName。所以 name 打印最后一个输入两次是正常的,因为这就是 inputName 所指向的,以及两个 name char 指针。

关于c - 为什么下面的代码片段分配会产生令人困惑的输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54031203/

相关文章:

c - 将字符串文字分配给 char 数组,字符串文字如何复制到堆栈上?

c++ - GCC 如何处理宏中的引号?

C 中 do while 循环中的计数器

java - 如何在不知道先验拆分字符的情况下拆分字符串?

python - 在大字符串中搜索文件路径。返回文件路径+文件名

html - 如何使用变量更改 HTML 文件的内容?

c - 别名命令在c中的系统函数下不起作用

c - Printf 和数组

javascript - 使用 lodash 按键过滤嵌套对象

ios - 将图像数组下载为字节数组并转换为图像