【问题标题】:Can't modify values at addresses allocated by malloc()无法修改 malloc() 分配的地址的值
【发布时间】:2016-04-20 08:31:18
【问题描述】:

在以下代码中:

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

int main(int argc, char *argv[])
{

    float *a; 
    printf("%x\n",&a);
    a = malloc(100*sizeof(float));
    printf("%x\n",a);
    *a=5;
    printf("%x\n",*a);
}

我希望在最终输出中看到“5”,但我看到的只是零。如何修改这些内存空间?

【问题讨论】:

  • 为什么要使用无符号十六进制整数说明符来打印float
  • %x 是一个指针,%f 是一个浮点数。 man printf
  • 天哪 :) 出于某种原因,我认为我可以使用 %x 打印所有内容
  • ... 并且指针值应该使用%p 而不是%x 打印。阅读printf
  • @Boiethios: "%x is a pointer" 不,x 转换说明符用于无符号整数。

标签: c pointers floating-point printf


【解决方案1】:

我希望在最终输出中看到“5”,但我看到的只是零。如何 我可以修改那些内存空间吗?

使用"%f"(或"%g"等适当的标识符)打印值。 (或使用显式转换为unsigned int 并打印sizeof(double) * CHAR_BIT 位)

使用"%u" printf 格式说明符打印double 参数会导致undefined behavior。相关帖子:Understanding implicit conversions for printf

不能修改 malloc() 分配的地址的值

如果a 不是NULL,您应该能够修改符合实现的内容。数据呈现有问题。

【讨论】:

    【解决方案2】:

    我相信这是您问题的有效答案。这似乎是关于 printf() 格式说明符并将浮点值输入为浮点数,而不是整数:

    #include <stdio.h>
    #include <stdlib.h>
    
    int main(int argc, char *argv[])
    {
    float *a; 
    printf("%p\n",(void*)a);
    a = malloc(100*sizeof(float));
    printf("%p\n",(void*)a);
    if(a != NULL) *a=5.0;
    printf("%f\n",*a);
    }
    

    终端输出如下所示:

    > ./a.out
    0x0
    0x1031009a0
    5.000000
    >
    

    【讨论】:

    • 不打印未初始化的指针。在打印之前将指针转换为void *
    • 感谢@Mohit Jain 的这个建议 - 我通过包含它改进了我的回复。尽管“printfing”未初始化的指针在我的 BSD UNIX 上被证明是有效的,但是对于可移植代码中的 未初始化的指针,总是需要格外小心。 (-:
    猜你喜欢
    • 2014-07-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-27
    • 1970-01-01
    • 2012-12-25
    • 2018-08-03
    • 2014-09-02
    • 2021-11-03
    相关资源
    最近更新 更多