c - scanf ("%d"中的错误格式说明符,unsigned short int) 在 gets(pointer) 更改 char 指针的值之后,但为什么呢?

标签 c pointers int unsigned short

我最近尝试了一些 C 编程并偶然发现了以下问题。我正在使用 NetBeans 7.4 64 IDE 和 MinGW 32 位。这是一个简短的示例代码,突出了我的问题:

int main(void) {

    unsigned short int temp;
    char *pointer;
    pointer = malloc(12 * sizeof(char));

    printf("The pointers value is %d \n", (int)pointer);
    printf("Type a short string:\n");

    gets(pointer);

    printf("The pointers value is %d \n", (int)pointer);
    printf("Type an int: \n");

//This line changes the char pointer to an apparently random value
    scanf("%d", &temp);

//Segmentation fault upon this point
    printf("The pointers value is %d \n", (int)pointer);

//And here as well
    free(pointer);


    return (EXIT_SUCCESS);
}

直到 scanf 一切都很好。 gets读取的字符串写入指针指向的内存空间。但是在处理 scanf 之后,指针的值发生了变化,因此指针指向任何空间。因此,不仅我的字符串丢失了,而且在尝试访问/释放不属于我的程序的内存时,我也会遇到段错误。

值的变化显然是随机的。每次我调试这个程序时,指针都会更改为另一个值。

我已经推断出 unsigned short int 有问题,或者更确切地说是我的 scanf 中的错误格式说明符(%d 而不是 %hu)。如果我将 unsigned short int 更改为 int 或使用 %hu 作为说明符,一切正常。所以有解决方案。

但我仍然很好奇指针为何以及如何受到此错误的影响。有人可以帮我吗?

最佳答案

你的程序有未定义的行为。

您需要告诉 scanf() 只有一个空间可以容纳一个 整数,否则它如何知道将数字存储为哪个大小?

更改为:

scanf("%hu", &temp);

其中 h 表示“一半”,即 shortu 表示 unsigned。您未能使用正确的格式转换说明符导致未定义的行为,其中 scanf() 覆盖了内存中的相邻变量。

此外,请注意 gets() 已被弃用,因为它非常危险:请不要使用它。改用行为更良好的 fgets() 。并且永远不要通过 sizeof (char) 来缩放分配,这只是一种非常难以阅读的编写 * 1 的方式,它没有增加任何值(value)。

关于c - scanf ("%d"中的错误格式说明符,unsigned short int) 在 gets(pointer) 更改 char 指针的值之后,但为什么呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19809527/

相关文章:

c - 指针作为函数返回和 malloc 的使用

使用有符号字符指针更改 int 数组的值

c - 格式化字符串攻击

c - 如何让 typedef 结构跨多个文件文件工作?错误 : invalid use of undefined type 'struct data'

K&R 2 第 5.10 节中的说明

c++ - OSX 终端中的鼠标位置/控制

C++指针管理与局部变量

具有对象指针的 byref 二维矩阵的 C++ 递归函数

c - 如果同一输入位置可能有 char 或 int,如何 scanf

c - 为什么 int 类型变量的值即使不在 int 范围内也会被打印?