一个c程序的疑惑
#include "stdio.h"
#include "string.h"
#define SIZE 81
#define LIM 100
#define STOP "quit"
int main(void)
{
char *input[LIM];
int ct=0;
printf("Enter up to %d lines(type quit to quit):\n",LIM);
while(ct<LIM && gets(input[ct])!=NULL && strcmp(input[ct],STOP)!=0 && input[ct][0]!='\0')
{
ct++;
}
printf("%d string entered\n",ct);
return 0;
}
为什么这个程序检错时没有错误,运行后键入字符后就不行呢?要是 char *input[LIM]改为char [LIM][SIZE]就可以了,为什么呢?
[解决办法]
没有分配空间
[解决办法]
char *input[LIM];
for( int i = 0;i < LIM;++i)
input[i] = (char *)malloc(SIZE * sizeof(char));
在程序结束后
加一个
for(int j = 0;j < LIM;++j)
free(input[j]);
[解决办法]
当你是用char *input[LIM]的时候,只是定义了一个指针数组,并没有给指针分配内存
用char [LIM][SIZE]的时候,已经在堆栈分配内存了,即声明了一个100行,每行可以存储81个字符的二维数组
下面的就可以
#include "stdio.h"
#include "string.h"
#include <malloc.h>
#define SIZE 81
#define LIM 100
#define STOP "quit"
int main(void)
{
char *input[LIM];
int ct=0;
printf("Enter up to %d lines(type quit to quit):\n",LIM);
do{
input[ct]=(char*)malloc(SIZE);
}while(ct<LIM && gets(input[ct])!=NULL && strcmp(input[ct],STOP)!=0 && input[ct++][0]!='\0');
printf("%d string entered\n",ct);
return 0;
}
[解决办法]
#include "stdio.h"
#include "string.h"
#include <malloc.h>
#define SIZE 81
#define LIM 100
#define STOP "quit"
int main(void)
{
char *input[LIM];
int ct=0;
printf("Enter up to %d lines(type quit to quit):\n",LIM);
do{
input[ct]=(char*)malloc(SIZE);//分配内存
}while(ct<LIM && gets(input[ct])!=NULL && strcmp(input[ct],STOP)!=0 && input[ct++][0]!='\0');
printf("%d string entered\n",ct);
for(int i = 0;i < ct;i++)//释放内存
free(input[i]);
return 0;
}
[解决办法]
char *input[LIM];仅仅分配了LIM个指针,但是并未分配实际的内存空间,这些指针都是野指针,程序之所以出问题,最直接的原因就是野指针访问.
[解决办法]