我正在学习 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/