提问人:Tanishk Nagda 提问时间:11/16/2023 最后编辑:Vlad from MoscowTanishk Nagda 更新时间:11/16/2023 访问量:42
从多维数组中的 mid 调用数组
calling an array from mid in a multidimensional array
问:
#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] 函数来做到这一点。请帮帮我。
答:
当你这样做时,你是在数组之外写字。当您随后在函数中使用时,用作从 .因为 ,这是指不存在的 。访问数组外部会导致未定义的行为。arr[n]
n
tables[1]
n==1
tables[2]
评论
tables[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
评论