提问人:luther 提问时间:11/12/2023 最后编辑:luther 更新时间:11/12/2023 访问量:54
在 C 函数中修改三维数组
Modifying 3 dimensional array in function in C
问:
我在 main() 函数中声明了一个 3D 数组: 我想使用另一个函数修改这个数组: 此函数如下所示:char currentPositions[5][6][2];
SetDefaultPositions(currentPositions);
void setDefaultPositions(char positions[5][6][2]){
char defaultPositions[5][6][2] = {
{"()", "()", "..", "..", "..", ".."},
{"/\\", "/\\", "/\\", "/\\", "/\\", "/\\"},
{"..", "..", "..", "..", "..", ".."},
{"/\\", "/\\", "/\\", "/\\", "/\\", "/\\"},
{"..", "..", "..", "..", "..", ".."}
};
positions = defaultPositions;
}
我尝试使用指针,但它一直告诉我这样的事情: 应为“char (**)[2]”,但参数的类型为“char (*)[6][2]” 警告:从不兼容的指针类型 [-Wincompatible-pointer-types] 传递“setDefaultPositions”的参数 1 或者没有错误,但打印 currentPositions 显示它是空的。 我什么都不懂,我也从网络上尝试了一些解决方案,但我找不到有类似问题的人。 这是学校项目,不允许使用全局变量。
答:
2赞
Weather Vane
11/12/2023
#1
不能将数组传递给 C 函数。它衰减为指针。
你可以这样做:
#include <stdio.h>
#include <stdlib.h>
void setDefaultPositions(size_t size, char positions[5][6][2]){
char defaultPositions[5][6][2] = {
{"()", "()", "..", "..", "..", ".."},
{"/\\", "/\\", "/\\", "/\\", "/\\", "/\\"},
{"..", "..", "..", "..", "..", ".."},
{"/\\", "/\\", "/\\", "/\\", "/\\", "/\\"},
{"..", "..", "..", "..", "..", ".."}
};
memcpy(positions, defaultPositions, size);
}
int main(void)
{
char arr[5][6][2];
setDefaultPositions(sizeof arr, arr);
for(int j = 0; j < 5; j++) {
for(int i = 0; i < 6; i++) {
printf("%.2s ", arr[j][i]);
}
printf("\n");
}
return 0;
}
程序输出:
() () .. .. .. ..
/\ /\ /\ /\ /\ /\
.. .. .. .. .. ..
/\ /\ /\ /\ /\ /\
.. .. .. .. .. ..
请记住,数组元素不是字符串——它们没有终止符。
评论
1赞
luther
11/12/2023
谢谢,现在我明白了,效果很好
0赞
tstanisl
11/12/2023
#2
数组不能通过赋值修改,因为在 C 中,数组的所有值都会衰减为指向数组第一个元素的指针。因此,无法执行:
array = value-of-array
因此,数组只能通过“按元素”或“memcpy()”赋值。
一个非常可靠且类型安全的方法是将指针传递给整个数组:
#include <string.h>
void setDefaultPositions(char (*positions)[5][6][2]) {
char defaultPositions[5][6][2] = {
{"()", "()", "..", "..", "..", ".."},
{"/\\", "/\\", "/\\", "/\\", "/\\", "/\\"},
{"..", "..", "..", "..", "..", ".."},
{"/\\", "/\\", "/\\", "/\\", "/\\", "/\\"},
{"..", "..", "..", "..", "..", ".."}
};
memcpy(positions, &defaultPositions, sizeof *positions);
}
int main(void) {
char arr[5][6][2];
setDefaultPositions(&arr);
}
传递不同维度(即 )的数组将引发编译器的警告。char[3][6][2]
评论
0赞
Weather Vane
11/12/2023
你测试过吗? 是。sizeof *positions
12
0赞
tstanisl
11/12/2023
@WeatherVane,没有。是 60 岁,而不是 12 岁。代码是正确的。查看 godbolt.org/z/1YhsvdMo7
0赞
Weather Vane
11/12/2023
由于您进行了编辑,它会输出正确的值。
0赞
tstanisl
11/12/2023
@WeatherVane,什么警告?你见过我送给你的神箭吗?
0赞
Weather Vane
11/12/2023
呃,我以为我复制了你的代码。
评论
"()"
不是一个字符。所以,它不能塞进一个.而且,要使用字符常量,您需要(单引号)。但是,这是两个字符。所以,再一次,不可能。你可以(只能)做:或等价物。char
'()'
'('
positions = defaultPositions;
=
char defaultPositions[5][6][2] = { { {'(', ')'}, ... }, { ... }, { ... }, { ... }, { ... } };
"()"
{ '(', ')' }
positions = defaultPositions;
-->memcpy(positions,defaultPositions,5 * 6 * 2);