gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 00:12:19 26 4
gpt4 key购买 nike

我最近尝试了一些 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com