BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #90015同步于 2016/1/24
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

对于realloc函数的一点问题,求解答

weiyuan
2016/1/24镜像同步4 回复
#include <stdio.h> #include <stdlib.h> char* get_string(){ char* s = (char*)malloc(sizeof(char)*11); int j; for( j=9; j>=0; --j ) s[j] = 'A'; s[10] = '\0'; return s; }; //产生字符串 int main(){ int size = 10; char** results = (char**)malloc(sizeof(char*)*size);//字符串数组 char** newPtr; int i,j; int delta = 10; for( i=0; i<20; ++i ){ if( i == size ){ newPtr = (char**)realloc(results, delta*sizeof(char*)); if(!newPtr){ printf("内存不足"); break; } results = newPtr; size = size + delta; }//新增加字符串数组的内存 results[i] = get_string(); printf("%c\n", results[0][0]); } } 代码是这样的,有一个字符串数组results,循环向这个数组里面添,20个字符串 添加的字符串是用get_string()函数得到的。 results数组最初大小是size = 10,如果不够会调用realloc函数新增加delta=10个内存空间。 按理说最后输出应该是20个A,但结果是下面这样的: AAAAAAAAAAAA???????? 通过调整delta 和 size的值有时候会避免这种奇怪的输出。 比如size设为3就不会有问题。。。
订阅后,新回复会通过你的通知中心匿名送达。
4 条回复
nuanyangyang机器人#1 · 2016/1/24
这个结果纯属偶然。 你realloc的时候,第二个参数应该是新的总大小,而不是增加的大小。你的delta和size都是10,这使得你把原来10个指针的数组重新分配成另一个10个指针的数组,大小没变。 随后,你访问了第11-20个元素,但空间没有那么大,溢出了。溢出的话,是未定义行为,就是从什么也不发生到机器冒烟都可以发生。 而碰巧,溢出了以后,某一次指针的写操作覆盖了results[0]指向的那个字符串(和malloc的实现有关,有可能那个字符串碰巧分配在results[]数组的后面)。你的printf语句永远只打印result[0]这个字符串的第0个字符。所以就看到那个字符变了。 建议改成这样: if( i == size ){ size = size + delta; // 先计算新的大小 newPtr = (char**)realloc(results, size*sizeof(char*)); // 然后分配的时候就只输入新的大小就行了。 if(!newPtr){ printf("内存不足"); break; } results = newPtr; }//新增加字符串数组的内存
nuanyangyang机器人#2 · 2016/1/24
楼主要不要来学Python? Python大法好,列表随意append,自动变长,字符串空间自动分配,不需要malloc,完全没有这种问题。 def get_string(): return "A"*10 results = [] for i in range(20): results[i] = get_string() print(results[0][0])
weiyuan机器人#3 · 2016/1/24
【 在 nuanyangyang 的大作中提到: 】 : 这个结果纯属偶然。 : 你realloc的时候,第二个参数应该是新的总大小,而不是增加的大小。你的delta和size都是10,这使得你把原来10个指针的数组重新分配成另一个10个指针的数组,大小没变。 : 随后,你访问了第11-20个元素,但空间没有那么大,溢出了。溢出的话,是未定义行为,就是从什么也不发生到机器冒烟都可以发生。 : ................... 哇,谢谢暖神
weiyuan机器人#4 · 2016/1/24
【 在 nuanyangyang 的大作中提到: 】 : 楼主要不要来学Python? : Python大法好,列表随意append,自动变长,字符串空间自动分配,不需要malloc,完全没有这种问题。 : [code=python] : ................... python也打算要学,常年看到暖神推荐python[ema3]