【问题标题】:Dynamic Memory allocation and structures动态内存分配和结构
【发布时间】:2013-06-11 07:22:24
【问题描述】:

所以我正在学习结构并尝试输入具有动态内存分配的字符串。

这是我目前所拥有的:

  typedef struct{
    char foo[81]; 
  } TYPE;


 void function(TYPE get[]){
   char a[81];
   scanf("%s", a);

   get->foo = malloc(strlen(a)+1*sizeof(char)); //this line produces an error that it is not assignable

   strcpy(get->foo,a);

   return; 

 }

我不确定那句话有什么问题,任何帮助将不胜感激。

【问题讨论】:

  • 顺便说一句,您的malloc() 参数没有任何意义。你的意思是(strlen(a) + 1) * sizeof (char),但由于sizeof (char) 总是 1,这应该写成strlen(a) + 1

标签: c arrays dynamic-allocation


【解决方案1】:

foo 是一个数组对象而不是一个指针,所以你不能使用这个操作

get->foo = (char*)calloc(strlen(a)+1,sizeof(char));

您正在尝试将(void *) 分配给类型char[81],这是完全不兼容的。在这种情况下,左值应该是指针。

【讨论】:

    【解决方案2】:

    你必须声明你 foo 是一个字符指针。

    typedef struct{
        char * foo; 
    } TYPE;
    

    【讨论】:

    • 为什么它不能作为数组工作?就我(有限的)理解而言,指针表示法只是编写数组的另一种方式
    【解决方案3】:

    您正在尝试为foo 分配内存并为其分配已分配内存的地址。那是行不通的。 foo 是一个数组,并且已经为它分配了内存(81 个char 元素。)因为它是一个数组,所以你不能给它分配地址。

    你想要的是将a字符串复制到foo

    scanf("%s", a);
    strcpy(get->foo, a);
    

    但是,您可以通过将扫描和复制操作实际限制为 81 个字符来做得更好,这样您就不会写到 fooa 的末尾:

    fgets(a, 81, stdin);
    strncpy(get->foo, a, 81);
    

    查阅fgets()strncpy() 的文档是个好主意(在那里你可以找到为什么你可以在调用 fgets() 时指定 81 而不是 80。)你应该始终小心不要写过去数组的结尾。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-12
      • 1970-01-01
      • 1970-01-01
      • 2014-11-24
      • 1970-01-01
      • 1970-01-01
      • 2015-05-17
      相关资源
      最近更新 更多