c-为什么我在函数中收到分段错误消息



我在第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("%sn", 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/ $ 

是的,分割错误就是紧接着出现的。尽管我以前已经遇到过这种情况,但我不明白背后的机制。

Q:如果字符串中的代码是问题所在,我该如何解决?如果不是字符串,那又怎样

strcat要求目标数组有一个已经以null结尾的字符串,并且有额外的空间来容纳整个串联字符串和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("%sn", concatenate);
free(concatenated);
}

因为您的目标字符串太短,并且strcat位于数组边界之外。两个字符串都需要有空间。

int main(void) {
char name[sizeof("MatthewGamer") + sizeof("PlayGames") - 1] = "MatthewGamer"; char name2[] = "PlayGames";
printf("%sn", add_str(name, name2));
}

最新更新