我似乎無法找到與我正在做的事情完全匹配的問題,所以在這裏。下面是我的C應用程序的減少版本,直到問題出在哪裏。我知道這是醜陋的代碼,錯過了一些錯誤檢查,但它只是爲了解決這個問題。現在,下面的示例應該將所有'A'轉換爲BCDE。代碼中的評論描述了這個問題。 (邵仁枚首先執行)Realloc在傳遞指針上崩潰
int runMe2(char *in, char **buffer) {
long x;
long b_size = 0;
long i_size = 1000;
long i = 0;
char t_buffer[1006];
// Initial malloc small as it will grow
*buffer = (char *)malloc(2*sizeof(char));
strcpy(*buffer, "");
for (x = 0; x < 999; x++)
t_buffer[x] = 0;
for (x = 0; x < strlen(in); x++) {
if (i >= i_size) {
char *r_buffer;
b_size = b_size + 1006*sizeof(char);
i_size = 0;
// Here is where the problem is.
// The first time through, i=1000, b_size=1006 and everything is fine
// The second time throgh, i=1004, b_size=2012 and the heap crashes on the realloc
r_buffer = (char *)realloc(*buffer, b_size);
if (r_buffer == NULL)
exit(0);
*buffer = r_buffer;
strcat(*buffer, t_buffer);
for (x = 0; x < 999; x++)
t_buffer[x] = 0;
}
if (in[x] == 'A') {
t_buffer[i++] = 'B';
t_buffer[i++] = 'C';
t_buffer[i++] = 'D';
t_buffer[i++] = 'E';
}
}
}
int runMe() {
char *out;
char in[30000];
int x = 0;
// Set up a 29,999 character string
for (x = 0; x < 30000; x++)
in[x] = 'A';
in[29999] = 0;
// Send it as pointer so we can do other things here
runMe2(in, &out);
// Eventually, other things will happen here
free(out);
}
你的意思是傷害'x',爲什麼不只是'memset' ? '''不會''t_buffer'結束? – Useless
什麼是一段難看的代碼;你正在做很多不需要的操作,並且你正在使用不真正需要的「幫助」值的人 – codewarrior
我不知道你認爲*做了什麼,但是從我所能看到的情況來看,它將BCDE連接到t_buffer中,在put字符串中,最終將緩衝區轉儲到增長目標*所有其他字符!='A'都是LOST。*如果這是故意的,有很多*更容易的方法來做到這一點,但有些事情告訴我,即使你崩潰'固定'這段代碼不會做你認爲它會。 – WhozCraig