【问题标题】:Why strcat() causes causes segmentation fault in the fallowing code? [closed]为什么 strcat() 会导致以下代码中的分段错误? [关闭]
【发布时间】:2020-09-07 16:04:09
【问题描述】:

为什么下面的代码会导致分段错误?

#include<studio.h>
#include<string.h>

int main ()
{
    char *name="Kaveri";
    char *rd="Rajshekhar";
    strcat(name,rd);
    puts(name);
    return 0;
}

【问题讨论】:

  • 请不要添加无关标签。
  • 您尝试写入被字符串文字占用的内存;并有一个缓冲区溢出来启动。该程序表现出未定义的行为。 strcat 的第一个参数预期指向一个足够大的可写缓冲区以容纳两个字符串的连接;您的缓冲区既不可写也不够大。

标签: c pointers segmentation-fault strcat


【解决方案1】:

要使strcat() 工作,目标缓冲区必须是可写的并且足够长,以保存带有空终止的连接输出。从手册页:

strcat() 函数将src 字符串附加到dest 字符串,覆盖dest 末尾的终止空字节('\0'),然后添加终止空字节。字符串不能重叠,dest 字符串必须有足够的空间用于结果。如果dest不够大,程序行为是不可预测的;

在您的情况下,目标是指向字符串文字的第一个元素的指针,尝试修改调用undefined behaviour

分段错误是未定义行为的众多副作用之一。

要解决这个问题,要么

  • name 设为一个数组,具有足够大的维度,例如

      char name[128] = "Kaveri";
    
  • 使用分配器函数为name分配足够的内存,比如

      char *name = malloc(128);  //sizeof(char) == 1
      strcpy(name, "Kaveri");
    

然后使用name 作为strcat 的目标缓冲区。

【讨论】:

    猜你喜欢
    • 2017-08-18
    • 2021-11-25
    • 1970-01-01
    • 1970-01-01
    • 2011-10-18
    • 1970-01-01
    • 2011-03-16
    • 2011-07-07
    • 1970-01-01
    相关资源
    最近更新 更多