我最近尝试了一些 C 编程并偶然发现了以下问题。我正在使用带有 MinGW 32 位的 NetBeans 7.4 64 IDE。这是一个简短的示例代码,突出了我的问题:
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 一切都很好。get 读取的字符串被写入指针指向的内存空间。但是在处理完 scanf 之后,指针的值会发生变化,以便指针指向任何空间。因此,不仅我的字符串丢失了,而且在尝试访问/释放不属于我的程序的内存时,我也会遇到分段错误。
值的变化显然是随机的。每次我调试这个程序时,指针都会变成另一个值。
我已经推断出 unsigned short int 有问题,或者更确切地说是我的 scanf 中的错误格式说明符(%d 而不是 %hu)。如果我将 unsigned short int 更改为 int 或使用 %hu 作为说明符,一切正常。所以有解决方案。
但我仍然很好奇指针为什么以及如何受到这个错误的影响。有人可以帮我吗?