【发布时间】:2016-07-22 12:56:17
【问题描述】:
我正在尝试一些随机的东西,以了解更多关于 malloc、realloc 和 free 以及它们一起使用时的行为方式。
我将包含代码和我的想法。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(void)
{
char *str;
/* Initial memory allocation */
str = (char *) malloc(15);
strcpy(str, "63tczfqV4nqB2YnH9iFJbGvGyyDkvK341rrj0G0mo1PEYniOVHejVIFIQnJzHSSMRbuyGMCZ4M5HFMV4y1q4QgYqyxp2XkTjxaolKTkaw1r25S2Emz061tw1");
printf("String = %s, Address = %u\n", str, *str);
/* Reallocating memory */
str = (char *) realloc(str,16);
strcat(str, "12345678");
printf("String = %s, Address = %u\n", str, *str);
free(str);
return 0;
}
我希望我的代码表现如下:
- 我使用 malloc 创建了一个字符型内存指针,指向(最多)15 个字节的内存。
- 使用那个字符指针,我使用 strcpy 保存了 120 个字符。
- 我将字符指针的大小调整为现在指向(最多)16 个字节。
- 我使用 strcat 将另外 8 个字符连接到已保存 120 个字符的内存缓冲区。
- 现在,我的字符指针应该指向 128 个字符,我试图重现这一点,但是,对于 128 个字符它失败了(但打印了使用 strcpy 保存的早期 120 个字符)。
确切的错误是这样的:
***** glibc detected *** ./a.out: realloc(): invalid next size: 0x0000000001690010 *****
控制台挂在上面,也就是说,我想它从未超过 realloc 行?
【问题讨论】:
-
您的代码有未定义的行为。您已经
malloced 15 个字符的存储空间,然后strcpy超出了此分配的限制。投反对票并投票结束。 -
所以如果我想保存 120 个字符,我应该使用 malloc(120) 吗?我希望它是 15 个字节(不是 15 个字符)。
-
您的初始
malloc必须至少是该字符串的长度 + 1(1 表示终止'\0')。在 C 中,分配的大小以chars/bytes 为单位,在这种情况下恰好是 8 位。 (标准说:字节可寻址的数据存储单元大到足以容纳执行环境的基本字符集的任何成员) -
@Avineshwar:在这种情况下,你真的应该首先阅读一本 C 书籍并理解其内容。在尝试跑步之前了解如何走路。
-
@AnttiHaapala:实际上“字节”和
char是标准中的同义词。宽度没有区别。
标签: c pointers malloc glibc realloc