【问题标题】:C printing double type pointer value doesn't workC打印双类型指针值不起作用
【发布时间】:2014-02-15 22:18:10
【问题描述】:

我需要制作一个简单的程序来创建由第一个数组中的 sqrt 元素组成的新数组。我必须在 main 中写入新数组的元素。我尝试调试我的代码,变量x 和y 显示了很好的数字(我初始化它们只是为了查看调试器的进度),但是当我尝试编写新数组的元素时,它显示出一些奇怪数字。一些善良的灵魂可以解释我做错了什么吗?

void returnSqrtArrayt(int* myArray, int length, double** newArray)
{
    int i;
    double x, y;
    double* p;
    double* arraySqrt=(double*)malloc(length*sizeof(double));
    for(i=0;i<length;i++)
    {
        x=*myArray;
        *arraySqrt=sqrt(x);
        y=*arraySqrt;
        myArray++;
        arraySqrt++;
    }

    *newArray=arraySqrt;

    p=arraySqrt;

    for(i=0;i<length;i++)
    {
        printf("%e\n",*p);
        p++;
    }
    printf("\n");
}

void main()
{
    int myArray[5]={4,2,16,4,81};
    int length=sizeof(myArray)/sizeof(int);
    int i;
    double* newArray;

    returnSqrtArrayt(myArray, length, &newArray);

    for(i=0;i<length;i++)
    {
        printf("%e\n",*newArray);
        newArray++;
    }   
}

【问题讨论】:

  • double* arraySqrt=(double*)malloc(length*sizeof(double)); 不正确。 not cast the return value of malloc 是一个很好的理由。
  • 你不应该这样做newArray++;,你会立即失去对你malloc()ed的记忆的引用,你将无法再次使用这些元素,除非你备份。
  • @StoryTeller:malloc() 通话很好,除了演员。
  • StoryTeller:当我不投射 malloc 时,我收到此错误:IntelliSense:“void *”类型的值不能用于初始化“double *”类型的实体 @PaulGriffiths:你能解释一下吗我如何从 main 写入新数组的元素?
  • @MahirDuraković:那么当您实际使用 C++ 时,您错误地将您的问题标记为 C。一旦解决了存储错误指针的问题,您就可以将新数组的元素写为newArray[i] = whatever;。

标签: c arrays pointers printf


【解决方案1】:

您所经历的是未定义的行为,因为您所做的是:

void returnSqrtArrayt(int* myArray, int length, double** newArray)
{
    ...
    double* arraySqrt= malloc(...);         // create new array

    for(i=0;i<length;i++)
    {
        ...
        arraySqrt++;                        // increment pointer to this array
    }

    *newArray=arraySqrt;                    // use incremented pointer

    // any use of *newArray or arraySqrt here tries to access incorrect memory !
}
最好使用临时指针 p 进行打印,因为递增 p 不会影响原始指针,但请尝试以下更改:
  • 在malloc 呼叫后立即执行*newArray=arraySqrt;
  • 在函数内部打印时使用 p=*newArray; 而不是 p=arraySqrt;

【讨论】:

  • 非常感谢!现在像魅力一样工作:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-03
  • 1970-01-01
  • 2019-08-06
相关资源
最近更新 更多