在C中分配浮点指针

时间:2014-01-29 00:11:26

标签: c pointers

我目前所拥有的是一个简单的函数,它基本上只是在给定参数指针的情况下重新分配指针,但我得到一个错误,说我正在使用其中一个未初始化的变量。这就是我所拥有的,错误是在线上投掷* x = * k;

float * program(const int *k)
{
    float *x;
    *x = *k;
    return x;
}

这必须是一个非常简单的解决方案,但我觉得我只是错过了它。

3 个答案:

答案 0 :(得分:5)

以下是您的代码正在执行的操作:

float * program(const int *k)
{
    // declare a pointer to a float, but don't initialize it,
    // so it is not actually pointing anywhere specific yet.
    float *x; 
    // Put the value pointed at by k into the location pointed at by x
    // But wait - we don't know where x is pointing, so this is BAD!
    *x = *k;
    return x;
}

这就是你的编译器抱怨的原因。

答案 1 :(得分:0)

看起来好像你正在对某个函数进行强制转换,或者通过函数实现强制转换。

编译器是正确的,x未初始化,因此分配给*x会导致未定义的行为(以及编译器警告您正在获取)。此代码可能是您想要的:

const float *program(const int *k)
{
    const float *x = (float *)k;
    return x;
}

你需要演员阵容 - 除非你用方式,方式进行编译,否则会禁用太多警告。请注意,这仍然提供了未定义的行为,但它是一种有点不同的未定义行为形式 - 对于大多数系统,此代码会将int指针重新解释为float指针,您将获得更多或者不那么理智的结果。使用未初始化的变量,您根本无法分辨将会发生什么;取消引用未初始化的指针要糟糕得多。

答案 2 :(得分:0)

请记住:
 A pointer is a variable that contains memory address. Other words, content of a pointer is memory address. To utilize the address, you have to request the system reserve it for you via malloc, calloc...

现在让我们检查你的代码:
- 第三行:float *x; - >你声明一个指向一个内存地址的指针x,它将用于存储(某些)浮点数。但是,地址尚未分配,因此它将位于系统内存中的任何位置,当然不会仅为您保留。
- 第四行:*x = *k; - >您访问尚未分配的内存分配 - >运行错误。如果幸运的话(没有程序访问此内存),您可以获得k的价值。

这里你应该做的是通过调用xmalloc来分配为calloc保留的内存,...

如果k仅指向1个int号,则代码应为:

float *program(const int *k)
{
   float *x;
   x = (float *)malloc(sizeof(float));
   *x = *k;
   return x;
}

如果k指向int数字,请自行弄明白:)