c - 为什么我不能将像 scanf() 或 gets() strcat() strcpy() 这样的字符串函数与字符指针变量一起使用?

标签 c string pointers

当我尝试使用带有字符指针变量的任何字符串函数时,我不明白为什么我总是收到段错误。我完全知道 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/

相关文章:

python - 替换部分字符串

c++ - "(void)pointer;"在 C++ 中是什么意思?

c - 请告诉为什么下面程序的输出是 JKLM??而不是 MLKJ?

c - 如何使用 IPv6 了解 C 中接口(interface)的 IP 地址

c - 从命令行读取可变行文件并存储

python - 如何检查字符串是否与 Python 中的设置模式匹配?

python - 如何使用 Python `string.find()` 找到段落的边界?

C、OpenMP、更改计划类型、setenv

c - 使用指针的数组内存地址分配声明的相同优先级

C++ 使用指针合并文本