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 字节。但这绝不是保证的行为,也不是您可以依赖的。
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 字节。但这绝不是保证的行为,也不是您可以依赖的。