【问题标题】:Unable to access C-Array elements from outside the method that creates it无法从创建它的方法外部访问 C-Array 元素
【发布时间】: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

标签: arrays c multidimensional-array clion


【解决方案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
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-24
  • 2013-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多