【问题标题】:strcpy seg fault in CC中的strcpy段错误
【发布时间】:2017-10-18 03:48:14
【问题描述】:

很好奇这个 strcpy 出了什么问题。

int main(void){
    char *history[10];
    for(int i = 0; i < 10; i++){
        history[i] = NULL;
    }
    char line[80];
    fgets(line,80,stdin); 
    strcpy(history[0],line); //This line segfaults
}

【问题讨论】:

  • 你在做strcpy(NULL, line)
  • 您忘记将存储分配给history[0],所以它当然会爆炸。您可以改用history[0] = strdup(line)
  • 通过char history[10]修改history的定义,使用strcpy(history, line),因为char *声明history的元素是一个指针,而不是一个字符。

标签: c segmentation-fault strcpy


【解决方案1】:

您已经创建了一个 NULL 指针数组。然后您尝试将字符复制到 NULL。这是不行的。

编辑: 您的程序可以为此优化:

void main() {
   char line[80];
   fgets(line,80,stdin); 
}

您的历史数组永远不会用于生成任何输出。因此,虽然其他人指出您需要分配内存,但从技术上讲,您可以简单地这样做:

history[0] = line;

这将是一个有效的指针,直到该行超出范围,也就是历史超出范围,所以它无关紧要。

【讨论】:

    【解决方案2】:

    您需要为history[0] 分配内存。由于 history[0] 被分配 NULL 引用它或写入它会/可能导致段错误。

    类似

    //this will create memory for 100 chars
    history[0] = malloc(sizeof(char) * 100); 
    strcpy(history[0],line);
    

    或者

    //shortcut for both - this allocate new memory and returns pointer.
    history[0] = strdup(line);
    

    【讨论】:

    • 初始化历史的最好方法是什么?也谢谢你的帮助
    • @MoStack,初始化为 NULL 没问题,但是当你想用它来存储字符时,你应该给它分配内存。
    • 这个答案会很棒,只要您将“将/可能导致段错误”替换为“可能行为不正常”。你不能说它“会导致段错误”的原因是给出了一个定义;它定义了结果,而在标准 C 中,结果被认为是未定义。其他事情也可能发生。通常不会导致段错误的未定义行为的显着示例包括:缓冲区溢出和格式字符串漏洞、竞争条件(多个线程同时访问同一资源)、有符号整数溢出和...这个,如果在某些设备上运行。
    猜你喜欢
    • 2016-02-24
    • 1970-01-01
    • 2014-10-21
    • 2013-02-23
    • 2016-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多