这是我的代码
我正在尝试使用一个名为createArray的函数创建一个数组,并将返回值保存在主函数内部的数组中,现在当我调用另一个名为乘法的函数时,使用这些数组名称作为参数,它不会调用该函数,也不会给出任何错误。
#include <stdio.h>
#include <math.h>
int createArray(int size)
{
int arr[size][size];
for (int i = 0; i < size; i++)
{
for (int j = 0; j < size; j++)
{
printf("Enter value of position row %d , column %d: ", i + 1, j + 1);
scanf("%d", &arr[i][j]);
}
}
return arr;
}
int multiplication(int arr1[10][10], int arr2[10][10], int size)
{
int i = 0, j = 0, k = 0;
int arr3[size][size];
for (i = 0; i < size; i++)
{
for (j = 0; j < size; j++)
{
for (k = 0; k < size; k++)
{
arr3[i][j] += arr1[i][k] * arr2[k][j];
}
}
}
printf("hello");
return arr3;
}
void display(int arr[10][10], int size)
{
for (int i = 0; i < size; i++)
{
for (int j = 0; j < size; j++)
{
printf("%d t", arr[i][j]);
}
printf("n");
}
}
int main()
{
int size;
printf("Enter size of the matrix: ");
scanf("%d", &size);
int arr1, arr2, arr3;
arr1=createArray(size);
arr2= createArray(size);
arr3= multiplication(arr1, arr2, size);
// display(arr3, size);
for (int i = 0; i < size; i++)
{
for (int j = 0; j < size; j++)
{
printf("%d t", arr3[i][j]);
}
printf("n");
}
return 0;
}
我想知道地址或指针是否有任何问题,因为数组名称是数组的第一个索引的指针。
在C语言中,当您在函数中定义变量时,内存是在堆栈上分配的,一旦函数返回,该内存将被释放,并且可能被调用下一个函数覆盖。
你应该通过malloc()
或类似的机制分配内存,你应该返回一个指针。
类型int[]
实际上是一个指向整数的指针。你的createArray()
函数返回一个整数,所以我认为它会尝试返回转换为整数的指针值,我很好奇如果你的编译器给出任何关于这些问题的警告。
我相信int[][]
等于int**
,所以实际上您应该按照这里的示例https://www.geeksforgeeks.org/dynamically-allocate-2d-array-c/分配每一行。
还请记住,内存将保持分配,直到您释放它或直到程序结束,所以您应该确保在您不再需要数据时将每个malloc()
调用与free()
调用配对。
我同意"这里是不精确的,因为我主要是指指针如何存储在内存中,我忽略了数据如何存储在内存中。
在createArray
中,您正在创建一个具有int arr[size][size];
自动存储持续时间的数组。这意味着它在声明它的块的生命周期内存在。函数调用者从return arr;
获得的指针将引用一个生命周期已结束的对象,因此是一个悬垂指针。
要在函数中分配数组并从中返回数组,您必须使用malloc
动态地执行此操作。这样,它将被分配存储时间,并且在free
被调用之前一直存在。
// allocate array
int *arr = malloc(size_of_array * sizeof(int));
// ...
// free array after using it
free(arr);
此外,int createArray(int size)
的函数签名目前指定了int
的返回类型。因为你实际上想要返回指向数组第一个条目的指针,所以createArray
应该返回int*
。
int* createArray(int size)
{
// Reserve size * size * sizeof(int) bytes of memory.
int *arr = malloc(size * size * sizeof(int));
// Fill the allocated memory space
for (int i = 0; i < size; i++)
{
for (int j = 0; j < size; j++)
{
printf("Enter value of position row %d , column %d: ", i + 1, j + 1);
scanf("%d", &arr[i * size + j]);
}
}
// return a pointer to the first entry in the array
return arr;
}
使用int arr3[size][size];
声明数组时,不指定arr3
的内容。使用malloc
动态分配数组也是如此。您必须将arr3
中的每个条目设置为0,否则arr3
很可能在multiplication
的末尾包含随机值。
您的multiplication
代码只适用于将arr1
和arr2
传递为int arr1[10][10]
时,size
等于10创建的数组。最好将指向数组第一个元素的指针传递给int *arr1
。
和之前一样,返回类型应该是int*
而不是int
。
int* multiplication(int *arr1, int *arr2, int size)
{
int i = 0, j = 0, k = 0;
// Reserve size * size * sizeof(int) bytes of memory for result array
int *arr3 = malloc(size * size * sizeof(int));
for (i = 0; i < size; i++)
{
for (j = 0; j < size; j++)
{
// fill arr3 with 0
arr3[i * size + j] = 0;
// compute multiplication
for (k = 0; k < size; k++)
{
arr3[i * size + j] += arr1[i * size + k] * arr2[k * size + j];
}
}
}
// return a pointer to the first entry in the result array
return arr3;
}
同样的修改可以应用于display
:
void display(int *arr, int size)
{
for (int i = 0; i < size; i++)
{
for (int j = 0; j < size; j++)
{
printf("%d t", arr[i * size + j]);
}
printf("n");
}
}
在main
中,你现在需要在arr1
,arr2
和arr3
上调用free
,因为它们是使用malloc
创建的。arr1
、arr2
和arr3
的类型也应该是int*
,而不是int
。
int main()
{
int size;
printf("Enter size of the matrix: ");
scanf("%d", &size);
int *arr1, *arr2, *arr3;
arr1 = createArray(size);
arr2 = createArray(size);
arr3 = multiplication(arr1, arr2, size);
display(arr3, size);
// free the allocated arrays
free(arr1);
free(arr2);
free(arr3);
return 0;
}