在函数中增加字符串大小时,realloc() 无效指针错误
realloc() invalid pointer error when increasing size of string in a function
当我 运行 代码显示 realloc()
无效指针错误。
input()
函数有什么问题吗?
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>
char *input(void)
{
int n = 1;
char *str = malloc(sizeof(char));
*str = '[=10=]';
while((*str=getchar())!='\n')
{
n++;
str = realloc(str,sizeof(char)*n);
str++;
}
return str;
}
int main(int argc, char const *argv[])
{
char *str = input();
printf("%s",str);
free(str);
return 0;
}
执行str++
后,指针不再指向分配字符串的开头。 realloc
需要原始指针,而不是指向已分配数据内部某处的指针。
你犯了一些错误:
你return字符串的结尾,不是开头。
realloc
需要原始地址(见 Thomas 的回答)
realloc
可能 return 一个新地址
你没有终止字符串。
以下修复了这些错误并包含了一些建议:
char *input(void)
{
size_t i=0;
int c;
char *str = malloc(1);
if (!str) return 0;
while((c=getchar())!=EOF && c!='\n')
{
str[i]= c;
if ((newstr = realloc(str,i+1))==0)
break; // out of memory: return what we have
str= newstr;
i++;
}
str[i]= '[=10=]';
return str;
}
没有冗余调用和完整错误检查的方法:
#include <stdio.h>
#include <stdlib.h>
char *input(void)
{
size_t n = 0;
char * str = NULL;
do
{
++n;
{
void * pv = realloc(str, (n + 1) * sizeof *str);
if (NULL == pv)
{
perror("realloc() failed");
break;
}
str = pv;
}
{
int result = getchar();
if (EOF == result)
{
if (ferror(stdin))
{
fprintf(stderr, "getchar() failed\n");
}
--n;
break;
}
str[n - 1] = result;
}
} while ('\n' != str[n - 1]);
if (NULL != str)
{
str[n] = '[=10=]';
}
return str;
}
int main(int argc, char const *argv[])
{
int result = EXIT_SUCCESS; /* Be optimistic. */
char * str = input();
if (NULL == str)
{
result = EXIT_FAILURE;
fprintf(stderr, "input() failed\n");
}
else
{
printf("input is: '%s'\n", str);
}
free(str);
return result;
}
当我 运行 代码显示 realloc()
无效指针错误。
input()
函数有什么问题吗?
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>
char *input(void)
{
int n = 1;
char *str = malloc(sizeof(char));
*str = '[=10=]';
while((*str=getchar())!='\n')
{
n++;
str = realloc(str,sizeof(char)*n);
str++;
}
return str;
}
int main(int argc, char const *argv[])
{
char *str = input();
printf("%s",str);
free(str);
return 0;
}
执行str++
后,指针不再指向分配字符串的开头。 realloc
需要原始指针,而不是指向已分配数据内部某处的指针。
你犯了一些错误:
你return字符串的结尾,不是开头。
realloc
需要原始地址(见 Thomas 的回答)realloc
可能 return 一个新地址你没有终止字符串。
以下修复了这些错误并包含了一些建议:
char *input(void)
{
size_t i=0;
int c;
char *str = malloc(1);
if (!str) return 0;
while((c=getchar())!=EOF && c!='\n')
{
str[i]= c;
if ((newstr = realloc(str,i+1))==0)
break; // out of memory: return what we have
str= newstr;
i++;
}
str[i]= '[=10=]';
return str;
}
没有冗余调用和完整错误检查的方法:
#include <stdio.h>
#include <stdlib.h>
char *input(void)
{
size_t n = 0;
char * str = NULL;
do
{
++n;
{
void * pv = realloc(str, (n + 1) * sizeof *str);
if (NULL == pv)
{
perror("realloc() failed");
break;
}
str = pv;
}
{
int result = getchar();
if (EOF == result)
{
if (ferror(stdin))
{
fprintf(stderr, "getchar() failed\n");
}
--n;
break;
}
str[n - 1] = result;
}
} while ('\n' != str[n - 1]);
if (NULL != str)
{
str[n] = '[=10=]';
}
return str;
}
int main(int argc, char const *argv[])
{
int result = EXIT_SUCCESS; /* Be optimistic. */
char * str = input();
if (NULL == str)
{
result = EXIT_FAILURE;
fprintf(stderr, "input() failed\n");
}
else
{
printf("input is: '%s'\n", str);
}
free(str);
return result;
}