我有关于动态数组的作业,因此我试图理解它如何与简单的程序一起工作。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
int cnt,i=0;
char temp[1001];
char *obj[5];
scanf("%d",cnt);
while(i<cnt){
scanf("%s",temp);
obj[i]=malloc(sizeof(char)*(strlen(temp)+1));
obj[i]=temp;
printf("%s\n",obj[i]);
printf("%d\n",i);
i++;
}
return 0;
}
当我将“cnt”等于5时,通过从stdin读取,程序将永远运行,尽管结束条件满足。但是当我得到“cnt”等于5时,通过分配它,在程序的最开始(不是通过使用scanf)程序工作得很好。 可能是什么原因?
答案 0 :(得分:7)
此:
scanf("%d",cnt);
应该是:
/* Always check return value of scanf(),
which returns the number of assignments made,
to ensure the variables have been assigned a value. */
if (scanf("%d",&cnt) == 1)
{
}
因为scanf()
需要地址 cnt
。
此外:
malloc()
。sizeof(char)
保证为1
,因此可以在malloc()
的空间计算中省略。malloc()
的结果以确保分配内存。free()
无论是malloc()
d。scanf("%s")
,该字符数必须比目标缓冲区小1,以便为终止空字符留出空间。在您的情况下scanf("%1000s", temp)
。obj
的越界访问没有保护。 while
循环的终止条件为i<cnt
,但如果cnt > 5
,将发生越界访问,从而导致未定义的行为。这会将temp
的地址指定为obj[i]
:
obj[i]=temp;
它不复制(并导致内存泄漏)。请改用strcpy()
:
obj[i] = malloc(strlen(temp) +1 );
if (obj[i])
{
strcpy(obj[i], temp);
}
答案 1 :(得分:1)
你应该使用这个
scanf("%d",&cnt);
顺便说一句:
scanf("%s",temp);
用于while循环来读取字符串。您必须在格式说明符的开头添加空格以避免换行问题。它应该是" %s"
答案 2 :(得分:0)
未定义的行为。您需要将变量的地址传递给scanf()
:
scanf("%d", &cnt);
但你最好不要使用scanf()
。 fgets()
使用起来更简单,更安全。