无法从创建它的方法外部访问 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 元素的主要内容,如果未能解决你的问题,请参考以下文章

Python面向对象-方法

如何访问函数外的数组元素

python进阶三(面向对象编程基础)3-3 python中定义实例方法

从中到外访问数组(非向量)元素的最简单方法是什么?

如何使用 Angular JS 从外部范围访问数组值

访问嵌套的外部函数元素