【问题标题】:Memory Allocation in c with string带字符串的c中的内存分配
【发布时间】: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


【解决方案1】:

我知道strcat函数是两个字符串之间的一个字符串

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

所以我的分配是大小 7

是的,这对于实现 strcat 是正确的,输入长度为 3 + 3,最后为空终止符留有空间。

但我需要在两个字符串之间留一个空格

不知道你为什么要这样做,但如果你想在它们之间添加一个空格字符,你确实需要分配一个额外的字节。

我需要分配 8 个吗?

仅当您需要为空间腾出空间时。

因为当我只做 sizeLength + 1 时,程序仍在运行

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

我觉得编译器原谅了我

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-11
    • 2023-03-25
    • 2021-07-27
    • 1970-01-01
    相关资源
    最近更新 更多