从多维数组中的 mid 调用数组

calling an array from mid in a multidimensional array

提问人:Tanishk Nagda 提问时间:11/16/2023 最后编辑:Vlad from MoscowTanishk Nagda 更新时间:11/16/2023 访问量:42

问:

#include<stdio.h>

void storeTables(int arr[][10] , int n ,int number);

int main() {
    int tables[2][10];
    storeTables(&tables[1],1,2);
    storeTables(tables,0,3);

    for(int i = 0 ; i<10 ; i++){
        printf("%d \t",(tables[0][i]));
    }
    printf("\n");

    for(int i = 0 ; i<10 ; i++){
        printf("%d \t",tables[1][i]);
    }
   return 0 ;
}

void storeTables(int arr[][10] , int n ,int number){
    for(int i = 0 ; i<10 ; i++){
        arr[n][i] = number * (i+1) ;
    }
}     

看看这段代码。当我写 storeTables(tables,0,2) 时,在 storeTable 中;它给出了预期的结果。如果我写 storeTables(&tables[0],0,2);它仍然给出了预期的结果。但是当我写 storeTables(&tables[1],1,2);它给出随机地址作为结果。这可能是错误的.传递 &tables[1] 仅意味着传递 2D 数组的第二行。这样做有什么问题.为什么答案是错误的?

我试着问 chatGPT,但它不明白错误。我期待一个 2 和 3 的表。如果我将指针传递给 2d 数组,我会得到结果。如果我将指针传递给一个包含 10 个整数的数组。我得到了结果,但我首先将指针传递给第二个 10 个整数数组,我的结果变得错误,开始打印地址。此外,像 &tables[0][1] 或 tables + 1 这样的东西将不起作用,因为我已经尝试了所有这些,我也尝试在 storeTables 函数中编写 int(*arr)[10] 而不是 int arr[][10],但我不想使用指针仅使用 int arr[][10] 函数来做到这一点。请帮帮我。

c 函数 多维数组 指针算术

评论


答:

1赞 Barmar 11/16/2023 #1

当你这样做时,你是在数组之外写字。当您随后在函数中使用时,用作从 .因为 ,这是指不存在的 。访问数组外部会导致未定义的行为。arr[n]ntables[1]n==1tables[2]

评论

0赞 Tanishk Nagda 11/16/2023
我是如何在数组之外编写的,你能不能进一步详细说明代码流。
0赞 Barmar 11/17/2023
数组索引为 0 和 1。写入超出数组的末尾。tables[2]
1赞 Vlad from Moscow 11/16/2023 #2

此函数声明

void storeTables(int arr[][10] , int n ,int number);

相当于

void storeTables(int ( *arr )[10] , int n ,int number);

对于这两个电话

storeTables(tables,0,2);

storeTables(&tables[0],0,2);

由于函数中的指针算术,这样计算的表达式就像你得到原始数组的第一行一样。arr[n]*( arr + n )*( arr + 0 )

对于此通话

storeTables(&tables[1],1,2);

这相当于

storeTables( &*( tables + 1 ),1,2);

这反过来又相当于

storeTables( tables + 1,1,2);

在函数中,表达式等价于 产生 。也就是说,表达式尝试访问原始数组之外的内存。arr[n]*( tables + 1 + n )*( tables + 2 )

您需要调用如下函数

storeTables(&tables[1], 0, 2);

或喜欢

storeTables( tables, 1, 2);

这是您更新的程序。

#include <stdio.h>

void storeTables( int arr[][10], int n, int number )
{
    for ( int i = 0; i < 10; i++ )
    {
        arr[n][i] = number * ( i + 1 );
    }
}

int main( void )
{
    int tables[2][10];

    storeTables( &tables[1], 0, 2 );
    storeTables( tables, 0, 3 );

    for (int i = 0; i < 10; i++)
    {
        printf( "%d \t", ( tables[0][i] ) );
    }
    printf( "\n" );

    for (int i = 0; i < 10; i++)
    {
        printf( "%d \t", tables[1][i] );
    }
}

程序输出为

3       6       9       12      15      18      21      24      27      30
2       4       6       8       10      12      14      16      18      20

评论

0赞 Tanishk Nagda 11/16/2023
我调用了类似 storeTables(&tables[1], 0, 2) 的函数;它仍然显示地址而不是 2 的表。
0赞 Vlad from Moscow 11/16/2023
@TanishkNagda我无法复制。请参阅我附加的答案。