返回信息流#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就不会有问题。。。
这是一条镜像帖。来源:北邮人论坛 / cpp / #90015同步于 2016/1/24
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
对于realloc函数的一点问题,求解答
weiyuan
2016/1/24镜像同步4 回复
订阅后,新回复会通过你的通知中心匿名送达。
4 条回复
这个结果纯属偶然。
你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;
}//新增加字符串数组的内存
楼主要不要来学Python?
Python大法好,列表随意append,自动变长,字符串空间自动分配,不需要malloc,完全没有这种问题。
def get_string():
return "A"*10
results = []
for i in range(20):
results[i] = get_string()
print(results[0][0])
【 在 nuanyangyang 的大作中提到: 】
: 这个结果纯属偶然。
: 你realloc的时候,第二个参数应该是新的总大小,而不是增加的大小。你的delta和size都是10,这使得你把原来10个指针的数组重新分配成另一个10个指针的数组,大小没变。
: 随后,你访问了第11-20个元素,但空间没有那么大,溢出了。溢出的话,是未定义行为,就是从什么也不发生到机器冒烟都可以发生。
: ...................
哇,谢谢暖神
【 在 nuanyangyang 的大作中提到: 】
: 楼主要不要来学Python?
: Python大法好,列表随意append,自动变长,字符串空间自动分配,不需要malloc,完全没有这种问题。
: [code=python]
: ...................
python也打算要学,常年看到暖神推荐python[ema3]