0

所以在我的程序中,我试图编辑原始数组“frags”的元素,这些元素最初分配了存储在某些插槽中的字符串。但我不完全确定如何。在程序过程中,我需要重新分配原始数组中的元素,以便它们可以存储更大长度的字符串,但我的方法似乎导致 valgrind + 功能错误。Valgrind 说错误来自 realloc,功能错误是输出不正确。

int main(void) {
   char *frag[3];
   char *frag1 = malloc(4), *frag2 = malloc(5);
   strcpy(frag1, "him");
   strcpy(frag2, "hers");
   frag[0] = frag1;
   frag[1] = frag2; 
   char *k = frag[0];
   char *l = frag[1];
   k = realloc(k, 500);
   strcat(k, l);
   printf("%s\n ", frag[0]);
   printf("%s\n ", frag[1]);
   free(k);
   free(l);
   return 0;
 }

当您将 malloc 和 realloc 分配给不同的变量时,我不是 100% 清楚它们是如何工作的。如果你这样做

char *k = malloc(5); 
char *l = k;
l = realloc(l, 100);  

您是否正在重新分配 k 仍指向的内存?释放和重定位指针“l”的变化会影响指针“k”的内容吗?抱歉,我是 C 新手。

4

1 回答 1

0
Are you reallocating the memory which is still pointed to, by k? Will changes in freeing and rellocating pointer "l" affect content of pointer "k"? Sorry, I am new to C.

char *k = malloc(5); 
char *l = k;
l = realloc(l, 100); 

k也许仍然指向 l,也许不是。如果 k 没有指向 l ,那么 l 已经被 realloc 释放了。

当你使用realloc. 它将尝试根据旧的内存地址获取内存,如果成功,k仍然指向l。而如果没有足够的内存.realloc将获得一个新的内存,地址与旧的完全不同,并将数据从旧内存复制到新内存。然后它将释放旧内存

于 2013-08-03T23:22:50.577 回答