C 在完成关闭函数时崩溃

标签 c arrays struct crash parameter-passing

我目前有一个基本的 C 程序,可以生成值并将其保存到结构内的数组中。每当调用基本函数时,程序就会崩溃。有谁知道这有什么问题吗?

#define SAMPLES 10   

struct values {
    double values[SAMPLES],mean;  } values;

int main()
{
    struct values array[0];
    setvals(array);
    return 0;
}

void setvals(struct values array[0]){
     int i;
     for( i = 0 ; i < SAMPLES ; i++ ) {
          array[0].values[i] = 2;
          printf("struct val = %f\n",array[0].values[i]);
      }
      printf("exitingfunc");
}

我可以看到结构中的值被设置为 2,但是一旦打印“exitingfunc”,整个程序就会崩溃 - 我在编译时没有收到任何错误或警告。有什么想法为什么会发生这种情况吗?

任何和所有的帮助appriced,

谢谢,J

最佳答案

大小为 0 的非堆数组不是合法的标准 C。

(您是否正在查看编译器错误/警告输出?某些编译器会允许这样做,并且可能会或可能不会提示。)

堆上的分配可以取零并返回一个可以安全释放的指针值。它可能是 NULL 或有效的内存地址(您不允许访问)。

尽管在这里您实际上尝试使用数组中不存在的第一个(即索引为 0)元素。因此将其声明为只有一个元素。

struct values array[1];

当然,你声明一个单元素数组很奇怪。也许您打算稍后使用更大的数字。但是,如果您想要的只是能够更改值类型的变量,那么您应该学习如何将指针传递给变量(即变量的地址)以在函数中更改它们:

struct values a;
...
setvals(&a);
...
void setvals(struct values *a){ /* or struct values a[] or a[1] */
    ...
    (*a).values[i] = 2; /* or pa->values[i] */

另请注意,当您使用数组表示法声明参数时,它仍然只定义一个指针。

关于C 在完成关闭函数时崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27161329/

相关文章:

programming-languages - increment++ 是如何工作的以及如何调整它以排除无效性?

c - 使用参数 C 运行程序

php - 将PHP数组格式转换为js数组格式,仅使用js

JavaScript - 使用 for 循环时子元素会重复

c++ - 结构和类

c - 为什么这个 print 语句会出错?

c - 对于数组,为什么会出现 a[5] == 5[a] 的情况?

php - 即使 PHP 中的顺序不同,如何检查两个索引数组是否具有相同的值?

c++ - 我可以使用结构的 "browse"成员来简化 BDD 类的构建吗?

go - 是否可以在 golang 中使用批量赋值?