c - c 中的指针数组代码不应运行

标签 c

//这段代码应该给出段错误……但它工作正常……这怎么可能……我只是在尝试一些主题代码时通过命中和追踪得到这段代码指针数组....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/

相关文章:

使用信号量时可以从c中的线程返回一个值吗

c - 如何在 C 中比较和解密 md5 密码哈希值?

c - 为什么 char 变量的大小在结构内部和外部时从 4 变为 1?

c++ - memcpy 中的指针运算有奇怪的结果

C 编程 - printf 语句给出 "expression expected"错误

objective-c - 从缓冲区读取数据如何影响 C 中另一个变量的值

c - 如何使C找到所有不同的符号(+,-,*,/)组合以获得一定的输出

C语言中无法逆序打印字符串

c - C中pthread_join()的返回顺序

c - 尝试递归匹配 2 个硬编码数组中的数字,无法进行超过 1 个成功循环