读书人

一个c程序的疑惑解决思路

发布时间: 2012-05-28 17:59:54 作者: rapoo

一个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个指针,但是并未分配实际的内存空间,这些指针都是野指针,程序之所以出问题,最直接的原因就是野指针访问.
[解决办法]

探讨
没有分配空间

[解决办法]
char *input[LIM]; //定义了LIM个字符指针。 <1>

char [LIM][SIZE]; //二维数组:定义了LIM个类型为char大小为SIZE的一维数组,而且其空间是在栈上分配的。<2>



<1>出错的原因是当输入时,使用了未初始化的地址空间,将会引发段错误。可以通过动态分配地址空间,也可以像你使用的《2》中方法使用数组在栈上分配固定的地址空间。

[解决办法]
没有分配空间

读书人网 >C语言

热点推荐