c中带字符串的内存分配

Memory Allocation in c with string

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] != '[=10=]'; i++) {
    str[i] = str1[i];
}

str[strlen(str1)] = ' ';
for (long i = 0, j = strlen(str1)+1 ; str2[i] !='[=10=]' ; i++, j++) {
    str[j] = str2[i];
    if(str2[i+1] == '[=10=]')
        str[j+1] = '[=10=]';
}

//puts(str);
printf("strlen STR -> %ld\n", strlen(str));
for (int i = 0; str[i] != '[=10=]'; i++) {
    printf("%c",str[i]);
}

free(str);

}

好的,我知道 strcat 函数是两个字符串之间的字符串。 假设我将输入“ttt”放入第一个字符串 第二个字符串输入“yyy”。 我现在正在使用 malloc 进行动态分配 现在我知道我们需要取第一个 + 第二个 + 1 的长度,其中 1 代表 '\0' 字符。

所以我的分配是 7 码。

但是我需要在两个字符串之间做一个space 我需要我的分配是8吗? 因为当我只做 sizeLength + 1 该程序仍在运行,它仍然在两个字符串之间放置一个 space,我觉得编译器原谅了我。

I know the strcat function is a string between two strings

嗯,不是吗?我什至不知道那是什么意思。 strcat 代表字符串连接(而不是乍一看可能认为的“扼杀猫”:))。在它们之间添加 space 不是标准库 strcat 的工作方式。

So my allocation is size 7

是的,这对于实现输入长度为 3 + 3 的 strcat 是正确的,space 用于末尾的空终止符。

but I need to make a space between the two strings

不确定你为什么要这样做,但如果你想在它们之间有一个 space 字符,你确实需要分配一个额外的字节。

Do I need my allocation to be 8?

仅当您需要为 space.

腾出空间时

because when I do only sizeLength + 1 the program is still working

这次只能靠(坏)运气了。 What is undefined behavior and how does it work?

I feel like the compiler forgives me

跟踪正确分配的内存量不是程序员的工作。 C 没有数组边界检查,也没有高级语言可能具有的自动(重新)分配等。

正如有人在评论中所说,malloc 可能会分配更大的对齐内存块。大小 8 字节似乎很可能是这样一个对齐块的候选者,无论您实际上是否只使用 7 字节。但这绝不是保证的行为,也不是您可以依赖的。