【问题标题】:array used uninitialized in this function此函数中使用的未初始化数组
【发布时间】:2014-02-11 10:37:44
【问题描述】:

我的任务是为整数数组(n 个元素)分配内存,为每个整数分配随机值,并按排序和未排序的方式打印它们。当我编译代码时,我得到这个警告“'v' is used uninitialized in this function”,当我尝试运行它时,我得到“Segmentation fault”。

我想知道如果我想用随机值填充数组,为什么要初始化数组?我为数组分配内存的方式有问题吗?(我不确定我所做的演员)

这是源代码:

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

int main() {
    int i, j, max, n, *v, aux;

    scanf("%d%d", &n, &max);

    *v=(int*)malloc(n*sizeof(int));
    for(i=0; i<n; i++){
        srand(time(NULL));
        v[i]=rand()%max;
    }

    for(i=0; i<n; i++){
        printf("%d ", v[i]);
    }
    printf("\n");

    for(i=0; i<n-1; i++){
        for(j=0; j<n-i-1; j++){
            if(v[j]>v[j+1]){
                aux=v[j];
                v[j]=v[j+1];
                v[j+1]=aux;
            }
        }
    }
    for(i=0; i<n; i++){
        printf("%d ", v[i]);
    }
    printf("\n");

    return 0;
}

如果有人能让我理解我做错了什么,并最终修改部分源代码,我将不胜感激。

【问题讨论】:

  • 我看到我做错了什么,应该删除v之前的“*”。
  • 你也应该把 srand() 放到 for 循环之外
  • 你应该先解决一个更简单的问题。看来您不熟悉 c 基础知识(即指针语法)。
  • 欢迎来到 SO。您的代码中还有其他一些问题。 (1) 不要将malloc 的返回值强制转换为 (2) 不要在循环中调用srand (3) 复制粘贴代码时要更加小心,例如从"#" 开始跨度>

标签: c arrays segmentation-fault initialization


【解决方案1】:

你在创建数组时打错了(我猜)。

*v=(int*)malloc(n*sizeof(int));

应该是

v=(int*)malloc(n*sizeof(int));

警告

在这个函数中使用'v'未初始化

是因为上面一行中的 *v 受到了尊重。

【讨论】:

  • 感谢您的快速回复!我不知道我是怎么错过的。
  • 作为教训警告有用
【解决方案2】:

这是你的问题:

*v=(int*)malloc(n*sizeof(int));

您将分配内存的地址分配给 v 的 dereference - 也就是说,您取消引用未初始化的指针,并写入“wild memory”。

此外,使用未初始化的仍然是一种获取随机性的烂方法。在您的手册中查找rand()

【讨论】:

  • 感谢您的回答,我会在手册中查找。我发现了另一个错误。如果 srand(time(NULL)) 位于循环中,我将为数组的所有元素获得相同的值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-15
  • 1970-01-01
  • 1970-01-01
  • 2016-01-19
相关资源
最近更新 更多