C 随机和指针不';行不通

C 随机和指针不';行不通,c,pointers,C,Pointers,您好,我正在尝试将浮点值增加到指针,但不知怎的,程序始终打印0.00000。 数字应在12.01至-13.00之间绘制 我的代码- #include <stdio.h> #include <stdlib.h> #include <time.h> int main() { float* num = (float*)malloc(sizeof(float)); srand(time(NULL)); *num = rand() % 13

您好,我正在尝试将浮点值增加到指针,但不知怎的,程序始终打印0.00000。 数字应在12.01至-13.00之间绘制

我的代码-

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

int main()
{
    float* num = (float*)malloc(sizeof(float));

    srand(time(NULL));

    *num = rand() % 1300 + 1201 / 100.00;

    printf("%f",num);
    system("PAUSE");

    free(num);
}
#包括
#包括
#包括
int main()
{
float*num=(float*)malloc(sizeof(float));
srand(时间(空));
*num=rand()%1300+1201/100.00;
printf(“%f”,num);
系统(“暂停”);
自由(num);
}

如果有人能帮我修一下,我会很高兴的。谢谢。

请注意*如果您想在打印地址时打印号码:

printf("%f",*num);

您需要打印num指向的值:

printf("%f", *num);

程序调用未定义的行为是因为
num
不是
float
而是指向
float
的指针,并且您试图通过
%f
调用中的
%f
转换说明符将其打印为
float
。另外,不要强制转换
malloc
的结果,并在
main
的参数列表中明确提到
void

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

int main(void) {
    float *num = malloc(sizeof *num);
    srand(time(NULL));
    *num = rand() % 1300 + 1201 / 100.00;
    printf("%f", *num);   // note *num instead of num
    system("PAUSE");

    free(num);
}
#包括
#包括
#包括
内部主(空){
float*num=malloc(sizeof*num);
srand(时间(空));
*num=rand()%1300+1201/100.00;
printf(“%f”,*num);//注意*num而不是num
系统(“暂停”);
自由(num);
}
两件事:

  • 不要用C语言强制转换你的
    malloc
    (与你的问题无关,但尽管如此)
  • 启用编译器警告
  • 做这两件事将帮助你避免问题。使用gcc-Wall编译我得到:

    警告:格式“%f”要求参数类型为“double”,但参数2的类型为“float*”[-Wformat=] printf(“%f”,num)

    这会回答你的问题。您使用的是
    %f
    格式说明符,但传递的是指针,而不是
    浮点
    双精度
    。您需要取消对指针的引用:

    printf("%f", *num);
    
    这些是错误:

    • *num=rand()%1300+1201/100.00

      *num
      在[12.011311.01]范围内。如果需要[12.01,13.00]范围内的数字,请更改分配:

      *num = 12.01 + (rand() % 100) / 100.0;
      
    • printf(“%f”,num)应该是
      printf(“%f”,*num)

    在编译期间启用额外警告也是一个好主意。例如,使用
    -Wall-Wextra

    clang -Wall -Wextra filename.c
    warning: format specifies type 'double' but the argument has type 'float *' [-Wformat]
    
    与gcc相同

    gcc -Wall -Wextra filename.c
    
    warning: format '%f' expects argument of type 'double', but argument 2 has type 'float *' [-Wformat=]
    
    如果您正在玩
    malloc
    /
    free
    ,您应该检查分配失败

    内存分配不能保证成功,可能会返回空指针。如果没有检查成功执行的分配,这通常会导致程序崩溃,因为空指针取消引用会导致分段错误

    因此,您可以通过以下方式更改代码:

    float *num = malloc(sizeof(float));
    if (num)
    {
      // your code
    }
    else
    {
      // handle failure
    }
    

    无论如何,最好只使用一个简单的浮点。

    除了修复
    printf(“%f”,*num),您需要检查您的数学

    如果您确实希望结果介于12.01和-13.00之间

    *num = (rand() % 2501 - 1300) / 100.00;
    

    在printf中,您是在打印数字还是对数字的引用?为什么要为单个变量分配内存?为什么不使用simple
    float num=rand()…
    ?这将顺便解决您的问题。不,您没有打印数字。我分配内存是因为我检查了一些事情…
    *num=(rand()%100+1201)/100.00谢谢我的错误我没有注意到