【问题标题】:C - passing allocated pointer and using realloc in separate functionC - 传递分配的指针并在单独的函数中使用 realloc
【发布时间】:2013-04-18 23:11:01
【问题描述】:

我需要找出一个数的所有质因数。我已经编写了这段代码,但是当我尝试使用 realloc 在 calculatePrimes 函数中重新分配指针数组时,gcc 会给出错误,即我在使用 realloc 之前没有分配指针。我知道我可以在 calculatePrimes 函数中传递双指针并使用 malloc,或者使用单指针并返回值。

代码:

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

void calculatePrimes(int max, int** array){
    int size=1, i;
    *array[0]=2;
    for(i=0; i<max; i++){
        if(isPrime(i)){
            *array = (int *)realloc(**array, (++size)*sizeof(int));
            *array[size-1]=i;
        }
    }
}

int isPrime(int value){
    int i=2, root = sqrt(value);
    for(;i<root;i++){
        if(value%i==0) return 0;
    }
    return 1;
}


void main(int argc, char*argv[]){
    int input = atoi(argv[1]), numPrimes;
    int *primes=(int *)malloc(sizeof(int));
    calculatePrimes(input, &primes);
    numPrimes=sizeof(primes)/sizeof(int);
    printf("%d\n", numPrimes);
    free(primes);
}

【问题讨论】:

  • 您应该显示确切的错误,因为您的重新措辞(“gcc 给出了我之前没有分配函数的错误”)没有多大意义。函数未分配...
  • 不要强制转换 malloc 或 realloc 的返回值,它可以隐藏某些细微的错误。

标签: c pointers malloc argument-passing realloc


【解决方案1】:

realloc() 的使用不正确。正确如下:

*array = realloc(*array, (++size)*sizeof(int));

当您将**array 传递给realloc() 时,您将传递数组的第一个元素的值int 而不是int*

请注意,我还删除了演员表。在 C 中,它不是必需的,它可以隐藏您不想隐藏的某些问题。具体来说,它可能会为您提供错误的 malloc/realloc 函数签名,如果您的 intvoid* 类型不兼容,可能会导致指针损坏。

【讨论】:

猜你喜欢
  • 2015-02-20
  • 2012-03-15
  • 2016-04-24
  • 1970-01-01
  • 1970-01-01
  • 2017-04-17
  • 2019-10-19
  • 2016-01-08
  • 1970-01-01
相关资源
最近更新 更多