gpt4 book ai didi

c - 为什么使用 malloc 创建的指针进行赋值会导致段错误

转载 作者:行者123 更新时间:2023-11-30 18:27:50 24 4
gpt4 key购买 nike

有人可以向我解释一下为什么使用 malloc这里会导致 mystrncat() 中指定行出现段错误?我的印象是我可以跨不同的堆栈帧访问堆的元素。有什么 Material 可以让我更好地理解这个主题吗?

谢谢。

编辑:

这是我更新的代码,该位置仍然存在段错误。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define initial_malloc 20

char* mystrncat(char *dest, char *source, int n);

int main(void) {
char *str1 = malloc(initial_malloc);
char *str2 = malloc(initial_malloc);
memset(str1, '\0', 20);
memset(str2, '\0', 20);
str1 = "hello";
str2 = "World";

mystrncat(str1, str2, 3);
return EXIT_SUCCESS;
}

char *mystrncat(char *dest, char *source, int n) {
int i, j, k, l;
j = strlen(dest);
for (i = 0; i < n && source[i] != '\0'; i++)
;
for (k = j, l = 0; k < (j + i - 1); k++, l++) {
dest[k] = source[l]; /* <-------runtime error here with malloc */
}
dest[k] = '\0';

return dest;
}

最佳答案

= 不复制字符串。它仅将字符串文字的地址(在您的情况下)分配给指针。字符串文字是只读的,任何写入它们的尝试通常都会以 SEGFAULT 结束。

您需要将文字复制(使用 strcpy)到 str1,然后可以连接它们。

此处根本不需要第二个字符串 (str2)。

使用正确的类型 (size_t) 并尝试保持正确的 const

顺便说一句,您在这里分配的内存丢失了。

稍作修改的版本

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define initial_malloc 20

char* mystrncat(char *, const char *, size_t);

int main(void) {
char *str1 = malloc(initial_malloc);

if(str1)
{
strcpy(str1, "hello");
mystrncat(str1, "World", 3);
printf("%s\n", str1);
free(str1);
}
return EXIT_SUCCESS;
}

char *mystrncat(char *dest, const char *src, size_t n)
{
char *SavedDest = dest;

while(*dest++);
dest--;
while(n && *src)
{
*dest++ = *src++;
n--;
}
*dest = 0;
return SavedDest;
}

关于c - 为什么使用 malloc 创建的指针进行赋值会导致段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52561123/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com