我需要制作一個函式來接收無限輸入,只有在到達 EOF 時才會停止閱讀。我必須使用該realloc功能。
這是我當前的代碼:
#include <stdio.h>
#include <stdlib.h>
char *getInput() {
char *currentString, currentChar;
int currentSize;
currentString = (char *)malloc(sizeof(char) * 2);
currentSize = 0;
currentChar = 0;
if (currentString != NULL) {
while (currentChar != EOF) {
currentChar = getchar();
currentString[currentSize ] = currentChar;
currentString = realloc(currentString, currentSize);
}
}
return currentString;
}
int main(int argc, char *argv[]) {
char *userInput;
userInput = getInput();
printf("\n string is: %s", userInput);
return 0;
}
代碼正常作業,除了每當我輸入一個大小超過 13 個字符的字串時,我都會收到以下錯誤(檔案名是 list_ab):
*** Error in `./list_ab': corrupted size vs. prev_size: 0x08ff6010 ***
======= Backtrace: =========
/lib/i386-linux-gnu/libc.so.6( 0x67377)[0xb75a7377]
/lib/i386-linux-gnu/libc.so.6( 0x6d2f7)[0xb75ad2f7]
/lib/i386-linux-gnu/libc.so.6( 0x7049e)[0xb75b049e]
/lib/i386-linux-gnu/libc.so.6(realloc 0x10e)[0xb75b162e]
./list_ab[0x804851d]
./list_ab[0x8048544]
/lib/i386-linux-gnu/libc.so.6(__libc_start_main 0xf7)[0xb7558637]
./list_ab[0x80483d1]
======= Memory map: ========
08048000-08049000 r-xp 00000000 08:02 359220 /home/user/Desktop/Maman12/list_ab
08049000-0804a000 r--p 00000000 08:02 359220 /home/user/Desktop/Maman12/list_ab
0804a000-0804b000 rw-p 00001000 08:02 359220 /home/user/Desktop/Maman12/list_ab
08ff6000-09017000 rw-p 00000000 00:00 0 [heap]
b7400000-b7421000 rw-p 00000000 00:00 0
b7421000-b7500000 ---p 00000000 00:00 0
b750d000-b7529000 r-xp 00000000 08:02 931606 /lib/i386-linux-gnu/libgcc_s.so.1
b7529000-b752a000 rw-p 0001b000 08:02 931606 /lib/i386-linux-gnu/libgcc_s.so.1
b7540000-b76f0000 r-xp 00000000 08:02 933356 /lib/i386-linux-gnu/libc-2.23.so
b76f0000-b76f2000 r--p 001af000 08:02 933356 /lib/i386-linux-gnu/libc-2.23.so
b76f2000-b76f3000 rw-p 001b1000 08:02 933356 /lib/i386-linux-gnu/libc-2.23.so
b76f3000-b76f6000 rw-p 00000000 00:00 0
b770b000-b770e000 rw-p 00000000 00:00 0
b770e000-b7710000 r--p 00000000 00:00 0 [vvar]
b7710000-b7711000 r-xp 00000000 00:00 0 [vdso]
b7711000-b7733000 r-xp 00000000 08:02 931813 /lib/i386-linux-gnu/ld-2.23.so
b7733000-b7734000 rw-p 00000000 00:00 0
b7734000-b7735000 r--p 00022000 08:02 931813 /lib/i386-linux-gnu/ld-2.23.so
b7735000-b7736000 rw-p 00023000 08:02 931813 /lib/i386-linux-gnu/ld-2.23.so
bfd35000-bfd56000 rw-p 00000000 00:00 0 [stack]
Aborted (core dumped)
經過大量谷歌搜索后,我發現每當我嘗試寫入無法訪問的位置時都會發生錯誤,但提到的修復都沒有奏效。我該如何解決這個問題?如果它有助于在 linux vm 上運行。
uj5u.com熱心網友回復:
代碼中存在多個問題:
的型別
currentChar應該是int容納所有可能回傳的值getchar(),即所有型別的值unsigned char(0對于2558 位位元組)和特殊的負值EOF(通常定義為(-1))。第一次測驗
currentChar != EOF時,變數currentChar未初始化,導致未定義的行為。您應該
EOF在從標準輸入讀取位元組之后并將其附加到陣列之前進行測驗。您在設定下一個字符后重新分配陣列:除了第一次,您將位元組寫入分配物件末尾之外:您應該在附加位元組之前重新分配陣列。
您沒有為空終止符分配足夠的空間,也沒有設定它。
你不檢查
malloc()也不realloc()失敗。您沒有釋放
main().一次重新分配一個位元組是低效的。
這是修改后的版本:
#include <stdio.h>
#include <stdlib.h>
char *getInput(void) {
size_t len = 0;
size_t size = 8;
char *str = malloc(size);
char *newstr;
int c;
if (str == NULL) {
fprintf(stderr, "malloc failure for %zu bytes\n", size);
return NULL;
}
while ((c = getchar()) != EOF) {
if (len 2 > size) {
/* increase the allocated block size by 50% */
size = size / 2;
newstr = realloc(str, size);
if (newstr == NULL) {
free(str);
fprintf(stderr, "realloc failure for %zu bytes\n", size);
return NULL;
}
str = newstr;
}
str[len ] = c;
}
/* try and reduce the size of the allocated string */
newstr = realloc(str, len 1);
if (newstr != NULL)
str = newstr;
/* set the null terminator */
str[len] = '\0';
return str;
}
int main() {
char *userInput = getInput();
if (userInput) {
printf("string is: %s\n", userInput);
free(userInput);
}
return 0;
}
uj5u.com熱心網友回復:
總結評論中的所有輸入:
argc&argv沒有被使用,那為什么要宣告它們呢?getchar()回傳 aint以覆寫EOF,通常所有位都設定為21的-1補碼表示法。所以,currentChar需要int。- 字串不是以 null 結尾的,當用作以 nul 結尾的字串時可能會導致緩沖區溢位。
free()使用后分配的記憶體。nul為('\0')騰出空間str& 檢查realloc().- 不要對變數名大方,閱讀需要時間。
代碼簡化:
#include <stdio.h>
#include <stdlib.h>
char* getInput() {
char *str = malloc (sizeof (char) * 2);
if (!str) {
perror ("malloc"); return NULL;
}
int ich;
int slen = 0;
while ((ich = getchar()) != EOF) {
str[slen ] = ich;
char* str2 = realloc (str, slen 1);
if (!str2) {
perror ("realloc"); free (str); return NULL;
}
str = str2;
}
str[slen] = '\0';
return str;
}
int main() {
char *userInput = getInput();
if (userInput) {
printf ("String is: %s\n", userInput);
free (userInput);
}
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/463869.html
