我目前所拥有的是一个简单的函数,它基本上只是在给定参数指针的情况下重新分配指针,但我得到一个错误,说我正在使用其中一个未初始化的变量。这就是我所拥有的,错误是在线上投掷* x = * k;
float * program(const int *k)
{
float *x;
*x = *k;
return x;
}
这必须是一个非常简单的解决方案,但我觉得我只是错过了它。
答案 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
的价值。
这里你应该做的是通过调用x
,malloc
来分配为calloc
保留的内存,...
如果k
仅指向1个int号,则代码应为:
float *program(const int *k)
{
float *x;
x = (float *)malloc(sizeof(float));
*x = *k;
return x;
}
如果k
指向int数字,请自行弄明白:)