's'的存储大小未知+指针指针

时间:2012-03-30 21:49:10

标签: c pointers struct malloc

问候语, 我遇到了错误“Assignment_1.c:10:18:错误:'s'的存储大小未知”我不是使用指针指针的专家,我想要一个动态大小的动态大小的单词数组。任何的想法?

#include <stdio.h>
#include <stdlib.h>
#define MAX 100
int size = MAX;
typedef struct{
    int numberOfWords,averageWordLength,id;
    char ** words;      
    }sentence;
void main(){  
    struct sentence s; 
    s.numberOfWords=3;
    s.averageWordLength=5;
    s.id=1;
    s->words= malloc(size * sizeof(s));
    //printf("%s",s.words);
    }

3 个答案:

答案 0 :(得分:7)

除非您尝试创建opaque类型,否则不要对结构使用typedef。这是错的。 struct对C开发人员来说是一个很好的暗示。 Linus对此有一个很好的描述:

  

错误将typedef用于结构和指针。当你   看一个

     

vps_t a;

     

在来源中,它是什么意思?

     

相反,如果它说

     

struct virtual_container * a;

     

你实际上可以说出“a”是什么。

     

很多人认为typedef“有助于提高可读性”。不是这样。他们   仅适用于:

     

(a)完全不透明的对象(typedef主动使用的对象)   隐藏的        对象是什么。)

 Example: "pte_t" etc. opaque objects that you can only access using
 the proper accessor functions.

 NOTE! Opaqueness and "accessor functions" are not good in themselves.
 The reason we have them for things like pte_t etc. is that there
 really is absolutely _zero_ portably accessible information there.
     

(b)清除整数类型,抽象帮助避免   混乱        无论是“int”还是“long”。

 u8/u16/u32 are perfectly fine typedefs, although they fit into
 category (d) better than here.

 NOTE! Again - there needs to be a _reason_ for this. If something is
 "unsigned long", then there's no reason to do
     

typedef unsigned long myflags_t;

 but if there is a clear reason for why it under certain circumstances
 might be an "unsigned int" and under other configurations might be
 "unsigned long", then by all means go ahead and use a typedef.
     

(c)当您使用sparse为字面创建 new 类型时        类型检查。

     

...

不要连续声明一堆变量。你这样做只会让别人感到困惑。

当然,您无法使用.运算符引用成员字段,您必须使用->。话虽如此,您的代码应该类似于:

#include <stdio.h>
#include <stdlib.h>

#define MAX 100

struct sentence {
    int numberOfWords;
    int averageWordLength;
    int id;
    char **words;
};

int main()
{
    struct sentence s;
    s.numberOfWords = 3;
    s.averageWordLength = 5;
    s.id = 1;
    s.words = malloc(MAX * sizeof(s));
    /* printf("%s",s.words); */
    return EXIT_SUCCESS;
}

还要考虑将`words作为结构的第一个成员,或者因为指针对齐大于整数的平台上的错位而浪费内存。

答案 1 :(得分:0)

使用' - &gt;'当结构的对象是指针类型时。这应该有效:

#include <stdio.h>
#include <stdlib.h>
#define MAX 100
int size = MAX;
typedef struct{
  int numberOfWords,averageWordLength,id;
  char *words;
}sentence;

void main(){
  sentence s;
  s.numberOfWords=3;
  s.averageWordLength=5;
  s.id=1;
  s.words= malloc(size * sizeof(s));
  //printf("%s",s.words);
}

答案 2 :(得分:-1)

typedef struct {
    int numberOfWords, averageWordLength, id;
    char **words;
    } sentence;

您为该结构创建一个未命名的结构和别名。别名是sentence

您现在的代码中有一个新类型。新类型名称为sentence。如果您提供了代码,则会有2个新的类型名称:sentencestruct tag

typedef struct tag {
    whatever;
} sentence;

另请注意,并不真正需要typedef

struct tag {
    whatever;
};

上面的代码段定义了一个名为struct tag的新类型。