当前位置: 首页 > 知识库问答 >
问题:

用Malloc修改C语言数组

孙绍辉
2023-03-14
void helperWithoutMalloc(int *arr) {
arr[0] = 18;
arr[1] = 21;
arr[2] = 23;
}

int main() {
int *data;
helperWithoutMalloc(data);

printf("%d\n", data[0]);
return 0;
}
void helperNotWorking(int *arr) {
arr = malloc(sizeof(int)*3);
arr[0] = 18;
arr[1] = 21;
arr[2] = 23;
}
int main() {
int *data;
helperNotWorking(data);

printf("%d\n", data[0]);
return 0;
}

主要的困惑是:第一个代码不管它的错误,仍然可以修改数组元素,而第二个代码,不能修改数组元素;因为两个函数都传递数组的地址;我们通过地址来操作数组元素

共有1个答案

杨腾
2023-03-14

C语言中的任何数据结构和其他语言中的数据结构一样,都必须提供一个存储区域,在那里可以保存它的数据。在第一个示例中,您没有做到这一点。“data”指针不指向任何内存,并已初始化。它在一个偶然的机会下工作了,你只是让你的程序在某个地方写数据,而这些数据碰巧是可写的。您需要以下内容:

int main() {
   int data[3]; // allocate an array for data
   helperWithoutMalloc(data);

在上面的例子中,内存是由3个元素的C数组提供的。

您可以以类似的方式使用malloc:

int main() {
   int *data = malloc(sizeof(int) * 3);
   helperWithoutMalloc(data);
int *helper() {
    int *arr = malloc(sizeof(int)*3);
    ...
    return arr;
}
int main() {
    int *data = helper();
    ...
 void helper(int **arr) {
    *arr = malloc(...)
    (*arr)[0] = 0;
    ...
 }

 int main () {
    int *data;
    helper(&data);
 类似资料:
  • 数组是一种内存分配的形式,数组是定义了一个连续的空间,与指针类似。 数组定义方式 类型 数组名[数组大小];//类型为每个空间的大小,我们通过数组名和下标访问数据,数组名指向存储数据的首地址,但是我们不可以改变数组名指向的地址。数组大小只有在定义的时候生效,定义之后不可以被改变。 int a[100]; //申请了一个名叫a的数组,它包含了100个整型。 数组的访问 我们可以通过数组的下标访问数

  • 在 Go 语言开篇中我们已经知道,Go 语言与 C 语言之间有着千丝万缕的关系,甚至被称之为 21 世纪的C语言。 所以在 Go 与 C 语言互操作方面,Go 更是提供了强大的支持。尤其是在 Go 中使用 C,你甚至可以直接在 Go 源文件中编写 C 代码,这是其他语言所无法望其项背的。 格式: 在 import "C" 之前通过单行注释或者通过多行注释编写C语言代码 在 import "C" 之

  • 概念 在我们了解了指针的基本概念之后,接下来我们来看一下指针和C中给我们提供的关键字中的类型修饰符它们之间的关系。指针就是存储地址的一种特殊变量。那这个变量跟我们的修饰符之间还有哪些更深层次的符号限制呐?我们在实际开发过程中,经常会运用修饰符,把指针的这种限制范围更明确的告诉给用户,通过不同修饰符告诉给用户指针的具体属性。 指针变量也是一个变量,它可以改变存储的地址,指向一个地方再指向另外一个地方

  • 我正在学习如何在C中创建动态1D数组。下面的代码尝试执行以下操作: 使用,创建长度为的动态数组,该数组保存类型为的值 测试: 问题 > 我的编码正确吗? 我找到的教程使用而不把放在前面。例如, int*指针<指针=malloc(2*sizeof(int)); 在VisualStudio2010和Windows7上,我无法编译此文件。错误消息是 void类型的值不能分配给类型的实体。 为什么它适用于

  • 问题内容: 我知道我的问题似乎无效,但这是真实的。在编写Java时,我必须使用单词以从classpath导入类。用户需要在Java中启动某些对象和其他关键字。我的问题是,通过定义新的关键字以及它们的作用或修改现有的关键字来做同样的事情,我们是否甚至有一点点的改进能力和这种出色的语言。例如,而不是编写: 有什么可能将单词修改为波斯尼亚语,例如: 一切都以相同的方式进行。在获得想法之前,请不要关闭。

  • 主要内容:二维数组的初始化(赋值)上节讲解的数组可以看作是一行连续的数据,只有一个下标,称为 一维数组。在实际问题中有很多数据是二维的或多维的,因此C语言允许构造多维数组。多维数组元素有多个下标,以确定它在数组中的位置。本节只介绍 二维数组,多维数组可由二维数组类推而得到。 二维数组的定义 二维数组定义的一般形式是: 其中,dataType 为数据类型,arrayName 为数组名,length1 为第一维下标的长度,length