【问题标题】:Return malloc in C在 C 中返回 malloc
【发布时间】:2015-07-15 09:01:05
【问题描述】:
int* dec2bin(int y){
    int *arr = (int*)malloc(sizeof(int)*5);
    int i;
    
    for (i=0; i<5; i++) arr[i]=0;
    
    return arr;
}

在这段代码中,我将0 写入arr[0]arr[4],但函数返回1070192。我要回00000

我做错了什么?

【问题讨论】:

  • 从不强制转换 malloc 的返回值开始。
  • 欢迎来到 Stack Overflow!警告:当在malloc(等)you should always write it 中以ptr = malloc(sizeof(*ptr) * ...); 而不是ptr = malloc(sizeof(ptrtype*) * ...); 调用sizeof 时。
  • 忽略我们看不到的事实,您在哪里调用返回的部分,所以我们无法弄清楚为什么。这就是您期望的结果。如果没有该信息,我们甚至无法猜测符号,因此“但此函数返回值 1070192”。只是一个没有任何内容的泡沫。我敢打赌,除了0's 和1's 之外没有返回任何东西,其他一切都是对任何层的解释,你甚至不与我们分享;)
  • 寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现它所需的最短代码。跨度>

标签: c malloc


【解决方案1】:

很可能您正在打印malloc() 返回的地址。

你需要一个循环来打印内容,例如

int *dec2bin(int size)
{
    return calloc(size, sizeof(int));
}

int main(void)
{
    int *data;
    int  index; 
    int  size;

    size = 5;
    data = dec2bin(size);
    if (data == NULL)
        return -1; /* allocation error */
    for (index = 0 ; index < size ; index++)
        printf("%d", data[index]);
    printf("\n");
    free(data);

    return 0;
}

你可以看到我使用了calloc(),那是因为你要将所有的值初始化为0,否则使用malloc()

【讨论】:

  • @hacks 这不是盲猜;这是问题的答案。如果不是 iharob 写的,我会写的。
  • @Zaibis 这不是-1的一个很好的理由,没有其他解释。另外,请注意 OP 说,此函数返回值 ...
  • @CareyGregory;我从来没有说过这不是答案。
  • @Zaibis 在这种情况下,问题应该被搁置为“不清楚你在问什么”/“无法以当前形式回答”等。不要仅仅因为问题是不清楚,但根据自己的优点判断答案。如果问题确实无法以当前形式得到回答,那么当它被关闭/删除时,所有答案也会随之消失。
  • @hacks: , iharob: 我照我说的做了。由于现在您的答案不再有联系,您也应该删除它。由于 hacks 编辑和 OP 仍未关闭,所以我没有投票,所以很可能是 ON-Topic。
【解决方案2】:

函数返回指向已分配内存的指针

int* dec2bin(int y){
    int *arr = (int*)malloc(sizeof(int)*5);
    int i;

    for (i=0; i<5; i++) arr[i]=0;

    return arr;
}

用于 5 个整数的数组。除非分配失败,否则它的地址可能不等于 0。但整数本身等于0。

如果你会这样写调用例如下面的方式(不清楚参数的含义)

int *p = dec2bin( 0 );

那么*p,数组的第一个元素,确实等于0

甚至你也可以写

int *p = dec2bin( 0 );

for ( int i = 0; i < 5; i++ ) printf( "%i ", p[i] );

你会得到数组的所有元素都等于0。

【讨论】:

    【解决方案3】:

    如果您想将该数组的值作为字符串(字符数组)获取,下面是您可以开始的代码。

    char* dec2bin(int y) {
        int *arr = (int *) malloc(sizeof(int) * 5);
        char output[50];
        int i;
    
        for (i=0; i<5; i++) arr[i] = 0;
        sprintf(output, "%d%d%d%d%d", arr[0], arr[1], arr[2], arr[3], arr[4]);
    
        return output;
    }
    

    要打印出来,你可以使用:

    char *string = dec2bin(0);
    printf("%s", string);
    

    【讨论】:

      猜你喜欢
      • 2017-03-23
      • 2020-09-03
      • 1970-01-01
      • 2014-09-25
      • 1970-01-01
      • 1970-01-01
      • 2012-11-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多