为什么我不能在C中使用函数参数作为数组大小?

时间:2017-11-11 02:31:05

标签: c arrays strncpy

我正在尝试创建一个简单的数组扩展函数,该函数创建一个新数组,其值与先前通过值扩展的数组相同:

char* test(char array[], int expandBy) {
    char newArray[sizeof(array) + expandBy];
    strncpy(newArray, array, sizeof(array));

    return newArray;
}

但是,我收到编译时错误expression must have a constant value。我在类似问题上看到的所有答案都建议使用宏,但如果我事先不知道这个值,我就不能使用宏。

有谁知道如何解决这个问题,或者是否有替代方法?

2 个答案:

答案 0 :(得分:4)

因为将数组传递给函数实际上传递了一个指针,所以sizeof给出了指针的大小而不是数组的大小,一个简单的解决方案是

char *test(char *array, size_t current_size, size_t expand_size)
{
    char string[current_size + expand_size + 1];
    // Rest of your code
}

但是,从这个函数返回数组string是错误的,因为它只在函数中有效。

我认为在继续使用c编码之前,你需要阅读内存分配,数组和指针,因为很明显你还没有所需的知识。

此外,一般情况下,您应该避免使用strncpy(),因为使用该函数无法保证null终结符,结果非常容易导致非null终止您将假设的数组是一个字符串,但它当然不是。

答案 1 :(得分:0)

我在你的代码中发现了两个错误。

首先,将数组传递给函数正是将指针传递给数组中的第一个元素。所以sizeof(array)返回指针的大小,而不是整个数组。

其次,函数中的数组存储在一个堆栈中,它会在程序离开函数后被销毁。返回由char newArray[size]创建的数组时,您无法获得任何错误。

以下是我的代码,可以帮助您:

#include <stdlib.h>
#include <string.h>

char *NewArray(char arr[], int arr_size, int expand_size)
{
    int new_size = arr_size + expand_size;
    char *new_arr = malloc(sizeof(char) * new_size);
    strncpy(new_arr, arr, new_size * sizeof(char));

    return new_arr;
}