c代码中的结果不正确

时间:2017-05-10 15:53:13

标签: c pointers

我有这段代码

before call 10.000000 $d $d 1
before call 10.000000 $d $d 1
after call 10.000000 $d $d 3

当我执行它时,我收到了

foward.py

我希望在第一次和第二次通话中获得5次,在最后一次通话中获得7次 a [i]未显示。 你能告诉我为什么吗? 感谢

2 个答案:

答案 0 :(得分:1)

您的代码应该如何显示

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
 void myfunction(double x, int y[2], int *d);

int main(int argc, char **argv)
{
   int a[2];
    int *c = malloc(sizeof(int));
    double b=10.0;
    *c = 5;
    a[0]=1;
    a[1]=2;

    printf("before call %f %d %d %d\n",b,a[0],a[1],*c);
    myfunction(b,a,c);
    printf("after call %f %d %d %d\n",b,a[0],a[1],*c);
}

void myfunction(double x, int y[2], int *d)
{
    double z;
    x=2*x;
    y[0]=3*y[0];
    y[1]=3*y[1];
    *d =*d+2;
}

注意,malloc正确的大小

数组从0开始

现代函数声明

首次使用时声明变量。

修复了prrintf格式(%not $)

答案 1 :(得分:0)

正如@OliverCharlesworth在评论中指出的那样,问题在于您使用$d代替%d。因此,format-string仅使用第一个参数a[1]。只需将$d替换为%d,您的代码就可以正常运行。

在另一个节点上。 C是零索引的。您正在访问数组,就好像它们是一个索引一样。这将导致您在某些时候出现问题,因为您正在访问未分配的内存。因此,在声明数组int a[2]时,应使用索引01来访问它。(a[0]a[1]

我冒昧地重写下面的代码:

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

void myfunction(int x, int* y, int *d);

int main(int argc, char *argv[])
{
    double b;
    int a[2], *c; 


    c  = (int*)(malloc(sizeof(c)));
    b  = 10.;
    *c = 5;
    a[0] = 1;
    a[1] = 2;

    printf("before call %f %d %d %d\n", b, a[0], a[1], *c);
    printf("before call %f %d %d %d\n", b, a[0], a[1], *c);
    myfunction(b,a,c);
    printf("after call %f %d %d %d\n", b, a[0], a[1], *c);
}

void myfunction(int x, int * y, int * d) 
{
    x = 2 * x;
    y[0] = 3 * y[0];
    y[1] = 3 * y[1];
    *d = *d + 2;
}