如何在c中用参数声明数组大小

How to declare array size with a parameter in c

我正在用 c 编写一个函数,这是我的代码:

char* makeMoves(char oldBoard[], int moveType, int empties, char player){
    int oldBoardLength;
    oldBoardLength = sizeof(oldBoard) / sizeof(oldBoard[0]);
    char result[oldBoardLength];
    copyBoard(oldBoard, result);
}

我觉得这行有问题:

char result[oldBoardLength];

如何创建长度为 oldBoardLength 的数组? 在 java 中是这样的:

char[] result = new char[oldBoard.length];

但在 c 中我不知道如何创建它。谁能帮帮我?

在 C 中,您必须在这种情况下分配动态存储空间。

char *result = malloc(oldBoardLength);
copyBoard(oldBoard, result);
free(result);

但是,您必须将 oldBoardLength 传递给函数,因为像 arr[]arr[8] 这样的参数将始终衰减为指针。在指针上取 sizeof 不是您想要的。看看这个例子的输出:

#include <stdio.h>

#define COUNT_OF(x) ((sizeof(x)/sizeof(0[x])) / ((size_t)(!(sizeof(x) % sizeof(0[x])))))

long int test(char array[16]) {
        return COUNT_OF(array);
}

void main(void) {
        char a[16];
        printf("%ld\n", COUNT_OF(a));  // prints 16
        printf("%ld\n", test(a));      // prints 8 or 4 for 64bit or 32bit systems
}

首先我会使用 char *oldBoard 而不是 char oldBoard[] 那里是一样的,但我认为 char *oldBoard 更清楚。其次,您不想使用 sizeof 因为那不会 return 正确的长度,您只会得到指针的大小。 sizeof(oldBoard) / sizeof(oldBoard[0]); 仅适用于静态分配的数组,或者至少这就是 How do I find the length/number of items present for an array? 的意思。使用另一个变量来跟踪数组长度。最后使用动态分配 aka malloc() 这样当你在函数之间传递它们时值就不会变成垃圾。我不太确定你想做什么,但这里有一个我认为你想做的例子。

char *makeMoves(char *oldBoard, int len, int moveType, int empties, char player)
{
    char *result;

    result = malloc(len);
    if(result == NULL)
    {
        return NULL;
    }

    copyBoard(oldBoard, result);

    return result;
}

int main(void)
{

    char *board, *result;
    int len = 10;
    int moveType, empties;
    char player;

    board = malloc(len);
    if(board == NULL)
    {
        return -1;
    }

    result = makeMoves(board, len, moveType, empties, player);
    if(result == NULL)
    {
        return -1;
    }

    free(board);
    free(result);

    return 0;
}

在 C 中,最常用的习惯用法是将指针参数指向的预期元素数作为单独的参数传递。应该是这样的:

char* makeMoves(char *oldBoard, int oldBoardLength, int moveType, int empties, char player) {
    /* ... */
}

这样,您的函数的调用者将负责传递正确的长度。