当我尝试使用带有字符指针变量的任何字符串函数时,我不明白为什么我总是收到段错误。我完全知道 fgets() 更好地确保不会发生覆盖,但我只是想编写一个程序来演示字符串函数如何实际覆盖内存地址中的数据,同时重新声明指针变量,即 pValues = "New Name";将指向一组完全不同的地址(包含您所需的字符)。
我非常清楚字符串函数似乎确实可以使用指针常量,即当像这样定义时:
char values[ ] = "Name Here";
但是为什么它们不适用于指针变量,即当这样定义时:char *pValues[ ] = "Name Here";
这是不断失败的部分......#include <stdio.h>
#include <string.h> // required for strcpy(), strcat(), strlen()
main()
{
char *pName = "Peter Jones";
printf("The string pName is \'%s\'\n\n", pName);
// Now lets change it to a longer string with more litterals...
pName = "Dragons Den is GREAT!";
printf("\nThe string pName is %s\n", pName);
puts("Please enter a new string for pName ");
gets(pName);
printf("pName is now %s\n", pName); // THIS PRODUCES SEGMENTATION FAULT
return 0;
}
我正在学习的这本书没有提到动态内存或堆——我还没有涉及。
最佳答案
BUT WHY do they not work for pointer variables i.e when defined like this:
char *pValues[ ]= "Name Here" ;
因为
pValues
是 不是 一个字符指针。这是一个 阵列 字符指针。如果你这样做:char *pValues = "Name Here" ;
您要使用的大多数功能都可以正常工作。一个异常(exception)是任何试图写入此指针指向的任何内存的函数: puts("Please enter a new string for pName ");
gets(pName);
printf("pName is now %s\n", pName); // THIS PRODUCES SEGMENTATION FAULT
这部分失败是因为 gets()
写入指向内存 protected 部分的指针。你用以下方法初始化它: char *pName = "Peter Jones";
所以pName
指向保存字符串文字的内存。如您所见,尝试写入该内存区域会导致段错误。您需要了解更多关于动态内存分配和堆的信息才能使用
gets()
用指针。
关于c - 为什么我不能将像 scanf() 或 gets() strcat() strcpy() 这样的字符串函数与字符指针变量一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63022445/