我正在试验 malloc 和 realloc 并想出了一些代码来解决以下问题:
我想创建一个未知大小的字符串,而不设置任何限制。我可以向用户询问 nr 个字符,但我宁愿在用户键入每个字符时调整 str 的大小。
所以我试图用 malloc + realloc 来做到这一点,想法是每次用户输入一个新的字符时,我使用 realloc 请求 +1 块内存来保存字符。
在尝试实现这一点时,我犯了一个错误,最终做了以下事情:
int main () {
/* this simulates the source of the chars... */
/* in reality I would do getch or getchar in the while loop below... */
char source[10];
int i, j;
for (i=0, j=65; i<10; i++, j++) {
source[i] = j;
}
/* relevant code starts here */
char *str = malloc(2 * sizeof(char)); /* space for 1 char + '\0' */
int current_size = 1;
i = 0;
while(i<10) {
char temp = source[i];
str[current_size-1] = temp;
str[current_size] = '\0';
current_size++;
printf("new str = '%s' | len = %d\n", str, strlen(str));
i++;
}
printf("\nstr final = %s\n", str);
return 0;
}
请注意,realloc 部分尚未实现。
我编译并执行了这段代码,得到了以下输出
new str = 'A' | len = 1
new str = 'AB' | len = 2
new str = 'ABC' | len = 3
new str = 'ABCD' | len = 4
new str = 'ABCDE' | len = 5
new str = 'ABCDEF' | len = 6
new str = 'ABCDEFG' | len = 7
new str = 'ABCDEFGH' | len = 8
new str = 'ABCDEFGHI' | len = 9
new str = 'ABCDEFGHIJ' | len = 10
我发现这些结果很奇怪,因为我预计程序会崩溃:str 有 2 个字符的空间,并且代码在没有请求更多内存的情况下向 str 添加了超过 2 个字符。根据我的理解,这意味着我正在写在我不拥有的内存中,所以它应该给出一个运行时错误。
那么......为什么这有效?
(编译器是 GCC 4.3.4。)
提前致谢。
编辑: 其中一位评论者建议调用 free() 可能会导致错误信号。我尝试使用上面的代码调用 free() 并且执行代码没有导致错误。但是,在源数组中添加了更多项,并且还调用了 free 后,得到了以下错误:
* 检测到 glibc./prog: free(): 下一个尺寸无效(快速):0x09d67008 * *