【问题标题】:Incorrect result in c codec代码中的错误结果
【发布时间】:2017-05-10 15:53:13
【问题描述】:

我有这个代码

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

main()
{
    double b;int a[2],*c; 
    void myfunction();
    c=(int*)(malloc(1));
    b=10.;
    *c=5;
    a[1]=1;a[2]=2;

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

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

当我执行它时,我会收到这个

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

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

【问题讨论】:

  • %,不是$...
  • c=(int*)(malloc(1)); [...] *c=5; 越界访问,未定义行为。
  • 另外 FWIW 这段代码是超级非惯用的 - 在同一行声明不同类型的变量,在函数内部声明的函数,旧式函数定义。
  • 你是从一本 30 年前的教科书学习 C 吗?请查找更新的内容。
  • 啊! K & R. 省点麻烦,使用 C11。

标签: c pointers


【解决方案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 开始

现代函数声明

在首次使用时声明变量。

固定的打印格式(% 不是 $)

【讨论】:

  • int argc,char **argv 未使用。为什么是int main(int argc, char **argv) 而不是int main(void)Z 未使用。
  • @pm100 谢谢
【解决方案2】:

正如@OliverCharlesworth 在他的评论中所说,这里的问题是您使用$d 而不是%d。因此,格式字符串仅使用第一个参数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;
}

【讨论】:

  • int argc, char *argv[]这里有什么故事?
  • @Joans 谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多