为什么在函数中出现分段错误消息?

时间:2020-09-26 12:58:24

标签: c string segmentation-fault

我将在第2部分中学习使用基本上与内存和字符串有关的语言。我想在C中制作一个类似于strcat()的函数,所以这是我到目前为止的内容:

#include <stdio.h>
#include <string.h>

char *add_str(char *str, char *str2);

int main() {
    char name[] = "MatthewGamer"; char name2[] = "PlayGames";
    printf("%s\n", add_str(name, name2));
}

char *add_str(char str[], char str2[]) {
    return strcat(str, str2);
}

不是说我想更改函数内部的内容,而是在字符串连接后出现问题。当我运行程序时,出现的是这样:

~/BPML/C/Phase2/ $ make add_str
clang -ggdb3 -O0 -std=c11 -Wall -Werror -Wextra -Wno-sign-compare -Wno-unused-parameter -Wno-unused-variable -Wshadow    add_str.c  -lcrypt -lcs50 -lm -o add_str
~/BPML/C/Phase2/ $ ./add_str
MatthewGamerPlayGames
Segmentation fault
~/BPML/C/Phase2/ $ 

是的,分割错误是随后出现的错误。即使我以前已经遇到过其中一种情况,我也不了解其背后的机制。

问:如果字符串中的代码有问题,如何解决?如果不是字符串,那该怎么办?

2 个答案:

答案 0 :(得分:1)

因为您的目标字符串太短,并且strcat在数组边界之外突出。您需要为两个字符串留出空间。

<div class="title-split">Hello there</div>

答案 1 :(得分:1)

strcat要求目标数组具有一个已为null终止的字符串 ,并且具有额外的空间来容纳整个串联的字符串终止符,否则,行为将为未定义

最可扩展的解决方案是使用strlenmallocmemcpy而不是完全使用strcat

#include <stdio.h>
#include <string.h>
#include <stdlib.h>


char *concatenate(const char *s1, const char *s2) {
    size_t s1_len = strlen(s1);
    size_t s2_len = strlen(s2);
    char *ret = malloc(s1_len + s2_len + 1);
    memcpy(ret, s1, s1_len);

    // copy the null terminator too
    memcpy(ret + s1_len, s2, s2_len + 1);
    return ret;
}

int main(void) {
    char *concatenated = concatenate("Hello ", "World!");
    printf("%s\n", concatenate);
    free(concatenated);
}