c-“s”的存储大小未知+指针到指针



问候,我遇到了"Assignment_1.c:10:18:error:'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);
    }

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

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

vps_t a;

在来源中,这意味着什么?

相反,如果它说

结构体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无符号长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) 当您使用稀疏为创建类型时类型检查。

不要在一行中声明一堆变量。你那样做只会混淆别人。

当然,不能使用.运算符引用成员字段,必须使用->。话虽如此,你的代码应该看起来像:

#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;
}

还可以考虑将单词作为结构的第一个成员,或者在指针对齐大于整数的平台上由于未对齐而浪费内存。

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

#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);
}

在中

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

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

现在,您的代码中有了一个新类型。新的类型名称为sentence。如果您提供了一个标记,那么将有两个新的类型名称:sentencestruct tag

typedef struct tag {
    whatever;
} sentence;

还要注意typedef并不是真正需要的

struct tag {
    whatever;
};

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

相关内容

  • 没有找到相关文章

最新更新