我试着在C中修改一个整数数组,最后我想返回一个指向该数组的指针,但似乎不起作用

int *h(int *a) {
 int b[10];
 while(*a) {
  *b = *a;
  b++;
  a++;
 }
 return b;
}

我不知道该怎么做,我是新手

推荐答案

您的代码有一些问题.

首先,您在函数中将b声明为局部array.在C语言中,局部数组驻留在堆栈上,这意味着它们会在函数完成后被清除.当您返回一个指向b的指针时,实际上您指向的是一个在函数退出后不再属于您的位置.

其次,还有一件事,你想要递增b,数组本身.在C中,数组的名称是指向第一个元素的常量指针.你不能像普通的指针一样移动它.

现在,我们如何解决这个问题?有几种方法:

  1. 与其在函数内部创建b,为什么不在外部创建并直接传入呢?这样,您可以在函数外部管理它的生命周期,并且在函数结束后它不会有消失的风险.

  2. 第二种解决方案.使用malloc动态分配b.这会将b放在堆上,而不是堆栈上,因此它会在函数结束后保留下来.只要记住,你分配的,你必须取消分配.因此,当您完成时,您将需要free这一内存,否则您将有一个内存泄漏.

您的问题的可能解决方案:

void h(int *a, int *b, int size) {
    for (int i = 0; i < size; i++) {
        b[i] = a[i];
    }
}

int main() {
    int a[] = {1, 2, 3, 4, 5};
    int b[5]; 
    h(a, b, 5);

    //use b here
}

C++相关问答推荐

变量的const视图是否定义良好?

如何一次获取一个字符

使用额外的公共参数自定义printf

在Rust和C之间使用ffi时如何通过 struct 中的[U8;1]成员传递指针

在循环中复制与删除相同条件代码的性能

为什么我的Hello World EFI程序构建不正确?

如何在POSIX-UEFI中获得输入?

如何在C-函数中混合使用C代码和ASM?

使用nmake for程序比Hello World稍微复杂一些

使用Open62541向OPCUA服务器发送读请求时内存泄漏

`预期说明符-限定符-列表在‘(三元运算符中的’token`‘之前

使用C++中的字符串初始化 struct 时,从‘char*’初始化‘char’使指针变为整数,而不进行强制转换

隐藏测试用例无法在c程序中计算位数.

GETS()在C++中重复它前面的行

发送和接收的消息中的Unix域套接字不匹配

被调用方函数内部的C-Struct变量,它是指针还是无关紧要

访问未对齐联合的成员是否为未定义行为,即使被访问的成员已充分对齐?

C 语言中 CORDIC 对数的问题

为什么程序在打印每个数字之前要等待所有输入?

段错误try 访问静态字符串,但仅有时取决于构建环境