-1

我有一个关于动态数组的作业,因此我试图了解它如何与简单的程序一起工作。

#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 时,程序将永远运行,尽管结束条件满足。但是当我得到“cnt”等于5时,通过分配它,在程序的最开始(不是通过使用scanf)程序工作得很好。这可能是什么原因?

4

3 回答 3

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")该最大字符数必须比目标缓冲区少一,以便为终止的空字符留出空间。在你的情况下scanf("%1000s", temp)
  • 对数组的越界访问没有保护objwhile循环的终止条件是,i<cnt但如果cnt > 5会发生越界访问,则会导致未定义的行为。

这将地址分配tempobj[i]

obj[i]=temp;

它不会复制(并导致内存泄漏)。改用strcpy()

obj[i] = malloc(strlen(temp) +1 );
if (obj[i])
{
    strcpy(obj[i], temp);
}
于 2013-04-18T11:14:56.257 回答
1

你应该用这个

scanf("%d",&cnt);

顺便提一句:

scanf("%s",temp);

在 while 循环中用于读取您的字符串。您必须在格式说明符的开头添加空格以避免换行问题。它应该是" %s"

于 2013-04-18T11:15:25.953 回答
0

未定义的行为。您需要将变量的地址传递给scanf()

scanf("%d", &cnt);

但是你最好还是不要使用scanf()fgets()使用起来更简单、更安全。

于 2013-04-18T11:17:45.613 回答