//这段代码应该给出段错误……但它工作正常……这怎么可能……我只是在尝试一些主题代码时通过命中和追踪得到这段代码指针数组....PLZ 谁能解释一下
int main()
{
int i,size;
printf("enter the no of names to be entered\n");
scanf("%d",&size);
char *name[size];
for(i=0;i<size;i++)
{
scanf("%s",name[i]);
}
printf("the names in your array are\n");
for(i=0;i<size;i++)
{
printf("%s\n",&name[i]);
}
return 0
最佳答案
您的代码中的问题(不完整,顺便说一句;您需要顶部的 #include <stdio.h>
和底部的结束 }
)可以用更短的代码块来说明:
char *name[10]; // make the size an arbitrary constant
scanf("%s", name[0]); // Read into memory pointed to by an uninitialized pointer
(name
可以是单个指针而不是数组,但为了清晰起见,我想保留您的程序结构。)
指针name[0]
还没有被初始化,所以它的值是垃圾。您将该垃圾指针值传递给 scanf
, 从 stdin
中读取字符并将它们存储在垃圾指针恰好指向的任何内存位置。
行为未定义。
这并不意味着该程序将 因段错误而终止。 C 不需要检查无效指针(也不禁止它,但大多数实现不进行那种检查)。因此,最可能的行为是您的程序将采用您提供的任何输入,并尝试将其存储在某个任意内存位置。
如果垃圾值name[0]
恰好指向一个可检测到的无效内存位置,您的程序可能会因段错误而终止。那就是你运气好的话。如果你不是,它可能恰好指向你的程序能够修改的一些可写内存位置。将数据存储在该位置可能是无害的,也可能会破坏您的程序所依赖的某些关键内部数据结构。
同样,您的程序的行为是未定义的。这意味着 C 标准对其行为没有强加要求。它可能看起来“有效”,它可能会在你面前爆炸,或者它可能会做程序在物理上可能做的任何事情。显然,行为正确可能是未定义行为的最坏结果,因为它使诊断问题变得困难(这可能会在关键演示期间出现)。
顺便说一下,使用 scanf
用%s
格式说明符本质上是不安全的,因为无法限制它将尝试读取的数据量。即使使用正确初始化的指针,也无法保证它指向足够的内存来保存它接收到的任何输入。
您可能习惯于执行运行时检查并且可以可靠地检测(大多数)此类问题的语言。 C 不是这样的语言。
关于c - c 中的指针数组代码不应运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47186290/