【发布时间】:2021-11-20 09:42:47
【问题描述】:
void Strcat(char str1[], char str2[]){
long len1 = strlen(str1);
long len2 = strlen(str2);
char* str = (char*)malloc(((len1 + len2) + 1)*sizeof(char));
if(str == NULL){
printf("No memory");
exit(1);
}
for (int i = 0 ; str1[i] != '\0'; i++) {
str[i] = str1[i];
}
str[strlen(str1)] = ' ';
for (long i = 0, j = strlen(str1)+1 ; str2[i] !='\0' ; i++, j++) {
str[j] = str2[i];
if(str2[i+1] == '\0')
str[j+1] = '\0';
}
//puts(str);
printf("strlen STR -> %ld\n", strlen(str));
for (int i = 0; str[i] != '\0'; i++) {
printf("%c",str[i]);
}
free(str);
}
好的,我知道 strcat 函数是两个字符串之间的字符串。 假设我将输入“ttt”放入第一个字符串 第二个字符串输入“yyy”。 我现在正在使用 malloc 进行动态分配 现在我知道我们需要取第一个 + 第二个 + 1 的长度,其中 1 代表 '\0' 字符。
所以我的分配大小是 7。
但我需要在两个字符串之间留一个空格 我需要分配为 8 吗? 因为当我只做 sizeLength + 1 该程序仍在工作,它仍然在两个字符串之间放置一个空格,我觉得编译器原谅了我。
【问题讨论】:
-
欢迎来到 SO。 “我需要我的分配是 8 吗?”当然,如果不是你,还有谁应该考虑这个空间?
-
“我觉得编译器原谅了我。”那只是运气不好。您正在导致未定义的行为,并且任何事情都可能发生。当灾难等待释放时,它看起来可以按预期工作......
-
您没有返回新字符串,因此没有理由创建它。你可以只做 printf。
-
@Gerhardh 但是你能向我解释为什么会发生这种情况,即使我分配了一个大小 7 并且我仍然插入空格字符和 \0 字符
-
C 编译器不能确保您正确管理动态内存。这完全取决于你。如果你做错了,你的程序在运行时可能会也可能不会导致错误,这取决于你错误地写入/访问的内存部分以及其他内存的用途。
标签: c string memory malloc allocation