【问题标题】:How to return dynamic array with function parameters如何返回带有函数参数的动态数组
【发布时间】:2022-11-17 02:53:38
【问题描述】:

我在返回带有函数参数的动态数组指针时遇到问题。我遇到段错误

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

void createArray(int *ptr, int n)
{
    ptr = malloc(n * sizeof(int));
    for(int i = 1; i <= n; ++i)
    {
        *(ptr + (i - 1)) = i*i;
    }
}

int main() {
    int *array = NULL;
    int n = 5;
    createArray(array, n);
    for(int i = 0; i < n; ++i)
    {
        printf("%d", array[i]);
    }
    return 0;
}

当我从 1 到 n 时,我必须用 i*i 填充我的数组。 我没有收到任何错误或警告。只是关于分段错误的消息。进程以退出代码 139 结束(被信号 11 中断:SIGSEGV)

【问题讨论】:

  • 请记住,C 仅传递函数参数按价值.这意味着调用中使用的值是复制进入函数局部参数变量。所以修改局部参数变量本身只会修改这个副本,而不会修改调用中使用的原始值。请研究一下在 C 中模拟引用传递.
  • 另一方面,为什么 *(ptr + (i - 1)) 而不是更容易阅读的 ptr[i - 1]
  • 是的,所以我应该做参数(int ** ptr)?
  • 问题是*ptr[i - 1],因为它和*(ptr[i - 1])一样,而你需要(*ptr)[i - 1]
  • 或者,您可以定义一个 int *createArray(int n) 函数并使其返回指向已分配内存的指针。称它为array = createArray(n);

标签: c pointers


【解决方案1】:

内存必须在调用函数中分配,但不能在被调用函数中分配。 此变体有效:

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

void createArray(int *ptr, int n){
 int i;
    for(i = 1; i <= n; i++)    {
        *(ptr + (i - 1)) = i*i;
// fprintf(stdout,"%d %d
", i, *(ptr + (i -1)));fflush(stdout);
    }
}

int main() {
    int i, n, *array = NULL;
 void *pvc;
    n = 5;
    array = (int *)malloc(n * sizeof(int));
    createArray(array, n);
    for(i = 0; i < n; i++)    {
        fprintf(stdout,"%d %d
", i, array[i]);fflush(stdout);
    }
 pvc = (void *)array;
 free(pvc);
    return 0;
}

【讨论】:

  • 它也可以分配给其他功能。谢谢你。
【解决方案2】:

您可以像这样通过函数参数更改指针:

void createArray(int **ptr, int n)
{
    *ptr = malloc(n * sizeof(int));
    for(int i = 1; i <= n; ++i)
    {
        (*ptr)[i - 1] = i*i;
    }
}

int main() {
    int *array = NULL;
    int n = 5;
    createArray(&array, n);

记得像这样调用函数:创建数组(数组,n);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-16
    • 1970-01-01
    • 2023-01-04
    • 2014-01-12
    • 1970-01-01
    • 2015-03-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多