在 C 函数中修改三维数组

Modifying 3 dimensional array in function in C

提问人:luther 提问时间:11/12/2023 最后编辑:luther 更新时间:11/12/2023 访问量:54

问:

我在 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 显示它是空的。 我什么都不懂,我也从网络上尝试了一些解决方案,但我找不到有类似问题的人。 这是学校项目,不允许使用全局变量。

数组 C 指针 3D

评论

0赞 Weather Vane 11/12/2023
题外话:你是否意识到它们不是 C 字符串——没有 nul 终止符?
0赞 Craig Estey 11/12/2023
"()"不是一个字符。所以,它不能塞进一个.而且,要使用字符常量,您需要(单引号)。但是,这是两个字符。所以,再一次,不可能。你可以(只能)做:或等价物。char'()''('
0赞 Weather Vane 11/12/2023
将对调用方不起作用。传递的数组实际上是一个指针,所以你只是覆盖了参数,而不是数组。而且你不能复制一个数组。我尝试使用指针 - 请发布一个最小可重现示例,这是显示问题的最短完整代码。positions = defaultPositions;=
1赞 Craig Estey 11/12/2023
我想你想要: 即: --> 并且,对于任务:char defaultPositions[5][6][2] = { { {'(', ')'}, ... }, { ... }, { ... }, { ... }, { ... } };"()"{ '(', ')' }positions = defaultPositions; --> memcpy(positions,defaultPositions,5 * 6 * 2);
1赞 Craig Estey 11/12/2023
@WeatherVane啊!固定!

答:

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 *positions12
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
呃,我以为我复制了你的代码。