我正在学习C语言。
当我传递一个指向gets()的指针时,我发现它可以很好地工作。
char *ptr;
gets(ptr);
puts(ptr);
但是,如果我定义了一个指针数组,它将无法正常工作。
char *ptr[4];
int i=0;
for(i=0;i<4;++i)
gets(ptr[i]);
for(i=0;i<4;++i)
puts(ptr[i]);
它们是不同的,还是第一部分实际上是错误的?我想知道原因。
您将指针传递到函数(例如gets()
),该函数将数据写入指针所指向的存储位置。在您的情况下,您具有uninitialized指针,这意味着它指向随机内存位置(应用程序或操作系统所在的位置)。这会导致随机效应-从“工作”到异常终止或挂起。您需要保留内存并分配指向该内存的指针,例如创建人:
char *ptr = (char*)malloc(256);
gets(ptr);
puts(ptr);
free(ptr);
考虑使用更安全的gets_s()
。
char *ptr[4];
int i=0;
for(i=0;i<4;++i)
gets(ptr[i]);
这不是有效的C代码,因为您没有为ptr[i]
分配空间。另一方面,切勿使用gets
,因为它是不检查缓冲区限制的函数。
指针必须先指向某处。
#define BUFSIZE 100
char *ptr = malloc(BUFSIZE);
fgets(stdin, ptr, BUFSIZE);
puts(ptr);
char *ptr[4];
int i=0;
for(i=0;i<4;++i) {
ptr[i] = malloc(BUFSIZE);
fgets(ptr[i], BUFSIZE, stdin);
}
for(i=0;i<4;++i) {
puts(ptr[i]);
}