无法从创建它的方法外部访问 C-Array 元素
Posted
技术标签:
【中文标题】无法从创建它的方法外部访问 C-Array 元素【英文标题】:Unable to access C-Array elements from outside the method that creates it 【发布时间】:2022-01-16 19:24:21 【问题描述】:在为我的系统编程课程练习时,我尝试用一种方法创建二维数组,然后在另一种方法中用 1 填充偶数位。 但是,将数组作为参数传递或将其作为全局变量都不起作用。
通过的参数版本:
#include <stdio.h>
#include <stdlib.h>
int rows;
int cols;
int* create (size_t r, size_t c)
int* arr = (int*)malloc(r*c*sizeof(int));
int i,j;
for(i=0;i<r;i++)
for(j=0;j<c;j++)
*(arr + i*c + j) = 0;
printf("%d",*(arr + i*c + j));
printf("\n");
void evenFill(int* array)
int i,j;
for(i=0;i<rows;i++)
for(j=0;j<cols;j++)
if(j%2==0)
*(array + i*cols + j) = 1;
void printArr(int* array)
int i,j;
for(i=0;i<rows;i++)
for(j=0;j<cols;j++)
printf("%d", *(array + i*cols + j));
printf("\n");
int main()
printf("Hello, World!\n");
rows = 5;
cols = 5;
int* array = create(rows, cols);
evenFill(array);
printArr(array);
return 0;
全局变量版本:
#include <stdio.h>
#include <stdlib.h>
int rows;
int cols;
int* array;
int* create (size_t r, size_t c)
int* arr = (int*)malloc(r*c*sizeof(int));
int i,j;
for(i=0;i<r;i++)
for(j=0;j<c;j++)
*(arr + i*c + j) = 0;
printf("%d",*(arr + i*c + j));
printf("\n");
void evenFill()
int i,j;
for(i=0;i<rows;i++)
for(j=0;j<cols;j++)
if(j%2==0)
*(array + i*cols + j) = 1;
void printArr()
int i,j;
for(i=0;i<rows;i++)
for(j=0;j<cols;j++)
printf("%d", *(array + i*cols + j));
printf("\n");
int main()
printf("Hello, World!\n");
rows = 5;
cols = 5;
array = create(rows, cols);
evenFill();
printArr();
return 0;
这两种变体在初始函数调用 evenFill() 后终止程序,退出代码 -1073741819 (0xC0000005) 显然与非法访问有关。
我做错了什么?
【问题讨论】:
您声明create
返回int *
,但它实际上返回了什么?
总是在编译时出现警告:-Werror -Wall -Wextra
【参考方案1】:
在两个版本中,create
函数都会初始化一个局部变量。
如果您想正确地将它作为参数传递,您需要从 create
函数中 return
它(目前缺少该函数 - 这可能会导致编译警告):
int* create (size_t r, size_t c)
int* arr = (int*)malloc(r*c*sizeof(int));
int i,j;
for(i=0;i<r;i++)
for(j=0;j<c;j++)
*(arr + i*c + j) = 0;
printf("%d",*(arr + i*c + j));
printf("\n");
return arr; /* This was missing */
如果你想使用全局变量,你需要删除create
中的类型声明,这样它就不再隐藏全局变量了:
int* create (size_t r, size_t c)
arr = (int*)malloc(r*c*sizeof(int)); /* Use the global variable */
int i,j;
for(i=0;i<r;i++)
for(j=0;j<c;j++)
*(arr + i*c + j) = 0;
printf("%d",*(arr + i*c + j));
printf("\n");
【讨论】:
哥们,我太傻了,tysm以上是关于无法从创建它的方法外部访问 C-Array 元素的主要内容,如果未能解决你的问题,请参考以下文章