c编程“访问冲突写入位置0x00000000”。

时间:2016-12-05 17:43:47

标签: c

我正在开发一个程序,我需要从用户那里获取字符串并对其进行操作。

问题是当我的程序结束时,我收到“访问冲突写入位置0x00000000”。错误信息。

这是我的代码

}
  //code
  char *s;
  s=gets();
  //code
}

经过一些阅读后,我重申使用gets()可能会导致一些问题所以我将char * s更改为s [20]只是为了检查它并且它在程序结束时没有任何错误就可以正常工作。

事情是我不提前知道字符串大小,因此,我不允许(学术前)创建字符串行为 - > s [HugeNumber]喜欢s [1000] 所以我别无选择,只能使用gets()函数。

有什么方法可以解决我的问题吗? 提前致谢

PS
还尝试使用malloc作为

char *temp;
char *s;
temp = gets();
s= (char*)malloc((strlen(temp) +1)* sizeof(char));

最后仍会弹出错误。
只要我有* something = gets();我的程序最后会抛出一个错误。

2 个答案:

答案 0 :(得分:3)

看起来你期望获得分配一个适当大小的字符串并返回指向它的指针,但这不是它的工作原理。 gets需要接收缓冲区作为参数,因此您仍需要声明具有大量数字的数组。事实上,我很惊讶你设法让你的代码编译,因为你传递了错误数量的参数来获取。

char s[1000];
if (gets(s) == NULL) {
    // handle error
}

gets的返回值是您作为参数传递给它的指针。返回值的唯一用途是检查错误,因为如果在读取任何字符之前,如果到达文件末尾,则gets将返回NULL。

与GNU libc中的getline更相似的函数:

char *s;
size_t n=0;
getline(&s, &n, stdin);

printf("%s", s); // Use the string here

free(s); //Then free it when done.

或者,你可以在循环中使用malloc和realloc做类似的事情。 Malloc是一个小缓冲区,然后使用fgets读入该缓冲区。如果整条线都适合缓冲区,那么就完成了。如果没有,则将缓冲区重新分配给更大的值(每次将其大小乘以常数因子)并继续从停止的位置读取。

另一种方法是放弃阅读任意大的线条。在C中你可以做的最简单的事情就是设置行长度的最大限制(比如255个字符),使用fgets读取到这个数量的字符然后如果给你一个更长的行,则中止错误比起那个来说。这样您就可以使用标准库中的函数,并使逻辑尽可能简单。

答案 1 :(得分:0)

您尚未分配临时。 你应该避免使用3种C语言。

void main() use int main() instead
fflush(stdin)
gets() use fgets() instead
相关问题