代码在 realloc() 上崩溃,我不明白为什么,分段错误(核心已转储)
Code crashes on realloc(), and I can't figure out why, segmentation fault (core dumped)
我正在尝试编写一个程序来读取输入并每行打印 60 个字符,并使用一个指针来存储字符。
而且我在输入很多字符时总是出现分段错误,我认为是 realloc() 导致的,但我不明白为什么。
这是我的代码(有点长,但如果有人能帮助我,我将不胜感激):
忽略空函数。
int main() {
int opt;
char *p;
int checkRead = -1;
p = (char*) calloc(60,1);
scanf("%d",&opt);
checkRead = readText(opt,p);
if (!checkRead) {
}
int readText(int opt, char *p) {
switch(opt) {
case dynamicList:
return dynamicReadText(p);
return 1;
}
int dynamicReadText(char *p) {
register int i;
int ch;
char *checker = NULL;
fflush(stdin);
for (i = 0; (ch = getchar()) != EOF; i++) {
if (i >= 60 && i % 60 == 0) {
checker = (char*)realloc(p,i+60);
if (!*(checker)) {
return 0;
}
p = checker;
free(checker);
checker = NULL;
*(p+i) = '\n';
i++;
}
if (ch == '\n') {
i--;
}
else {
*(p+i) = ch;
}
}
*(p+i) = '[=10=]';
return 1;
}
问题多多
checker = (char*)realloc(p,i+60);
if (!*(checker))
应该是
checker = (char*)realloc(p,i+60);
if (!checker)
您想检查 realloc
返回的值是否为 NULL
。您正在检查内存块的第一个字符是否为零。
第二个问题可能是导致 SIGSEGV 的问题。
Select 行代码:
char *checker = NULL;
checker = (char*)realloc(p,i+60); // Allocates a memory block.
p = checker; // Both p and checker points to this block.
free(checker); // The block is freed.
*(p+i) = '\n'; // XXX Derefs a pointer pointing to freed memory.
最后,您正在更改 dynamicReadText
的 p
,期望这会更改 readText
中的 p
。同样,您希望更改 readText
的 p
将更改 main
的。但这些是完全不同的变量。 C 总是按值传递。
好吧,我最后说了,但只是在这个答案涵盖的范围内。我还没有确定没有其他问题。
总而言之,您的代码应如下所示:
int f(char **p_ptr) {
...
while (...) {
...
char* tmp = realloc(*p_ptr, ...);
if (!tmp) {
...
}
*p_ptr = tmp;
...
}
...
}
int main(void) {
char *p = NULL;
f(&p);
...
free(p);
}
我正在尝试编写一个程序来读取输入并每行打印 60 个字符,并使用一个指针来存储字符。 而且我在输入很多字符时总是出现分段错误,我认为是 realloc() 导致的,但我不明白为什么。
这是我的代码(有点长,但如果有人能帮助我,我将不胜感激): 忽略空函数。
int main() {
int opt;
char *p;
int checkRead = -1;
p = (char*) calloc(60,1);
scanf("%d",&opt);
checkRead = readText(opt,p);
if (!checkRead) {
}
int readText(int opt, char *p) {
switch(opt) {
case dynamicList:
return dynamicReadText(p);
return 1;
}
int dynamicReadText(char *p) {
register int i;
int ch;
char *checker = NULL;
fflush(stdin);
for (i = 0; (ch = getchar()) != EOF; i++) {
if (i >= 60 && i % 60 == 0) {
checker = (char*)realloc(p,i+60);
if (!*(checker)) {
return 0;
}
p = checker;
free(checker);
checker = NULL;
*(p+i) = '\n';
i++;
}
if (ch == '\n') {
i--;
}
else {
*(p+i) = ch;
}
}
*(p+i) = '[=10=]';
return 1;
}
问题多多
checker = (char*)realloc(p,i+60);
if (!*(checker))
应该是
checker = (char*)realloc(p,i+60);
if (!checker)
您想检查 realloc
返回的值是否为 NULL
。您正在检查内存块的第一个字符是否为零。
第二个问题可能是导致 SIGSEGV 的问题。
Select 行代码:
char *checker = NULL;
checker = (char*)realloc(p,i+60); // Allocates a memory block.
p = checker; // Both p and checker points to this block.
free(checker); // The block is freed.
*(p+i) = '\n'; // XXX Derefs a pointer pointing to freed memory.
最后,您正在更改 dynamicReadText
的 p
,期望这会更改 readText
中的 p
。同样,您希望更改 readText
的 p
将更改 main
的。但这些是完全不同的变量。 C 总是按值传递。
好吧,我最后说了,但只是在这个答案涵盖的范围内。我还没有确定没有其他问题。
总而言之,您的代码应如下所示:
int f(char **p_ptr) {
...
while (...) {
...
char* tmp = realloc(*p_ptr, ...);
if (!tmp) {
...
}
*p_ptr = tmp;
...
}
...
}
int main(void) {
char *p = NULL;
f(&p);
...
free(p);
}