【问题标题】:C program crashes when accessing next element in array of struct访问结构数组中的下一个元素时,C程序崩溃
【发布时间】:2018-02-17 16:10:12
【问题描述】:
void struct_tokens(struct Words **w_count, int size)
{
    *w_count = (struct Words*)calloc(size, sizeof(struct Words)); 
    char *temp;
    int n = 0;
    int i = 0;
    printf("Value 1: %s\n", (*w_count[0]).word);
    printf("Value 2: %s\n", (*w_count[1]).word);
}

我的结构如下所示:

struct Words
{
    char word[20];
    unsigned int count;
};

只要我访问数组中的下一个元素,它就会崩溃,因此访问了 w_count[0],但它无法访问 w_count[1] 而不会崩溃。所以 Value 1 打印到控制台,但 Value 2 没有,这是为什么呢?

【问题讨论】:

  • struct_tokens()是怎么调用的,set里面的变量是怎么传入的。
  • 向我们展示一个尽可能简单但仍存在此问题的完整程序。
  • 答案成立 - 在给定代码的早期,您访问的方式会导致未定义的行为。但是然后更正一下,如果您仍然遇到错误,那么您没有显示某些内容
  • calloc() 的调用看起来更像是对malloc() 的调用,但名称中有错字。
  • @coderredoc 我重新检查了我的代码,看来我没有完全改变你的一行,为那个伙伴欢呼它现在似乎可以工作了:)。

标签: c pointers crash


【解决方案1】:

calloc 调用是错误的 - 应该是

*w_count = calloc(size, sizeof(struct Words));

访问结构的实例将是

printf("Value 1: %s\n", (*w_count)[0].word);

[]precedence 高于 *。在较早的情况下,您的行为未定义(导致崩溃)。

还要注意分配的内存将被初始化为0。因此,char 数组将包含 \0 以外的任何内容 - 在 printf 中使用时不会打印任何内容。

几点:

  • void*struct Words * 的转换是隐式完成的 - 您不需要强制转换。

  • 检查calloc的返回值,如果它返回NULL,你应该适当地处理它。

  • 使用完动态分配的内存后释放它。 (使用free())。

  • calloc 的正确代码如下所示:-

    *w_count = calloc(size, sizeof(struct Words));
    if( *w_count == NULL ){
       perror("calloc");
       exit(EXIT_FAILURE);
    }
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-20
    • 1970-01-01
    • 2016-06-19
    • 2018-05-27
    • 1970-01-01
    相关资源
    最近更新 更多