为什么可以';我在C中使用函数参数作为数组大小吗?

为什么可以';我在C中使用函数参数作为数组大小吗?,c,arrays,strncpy,C,Arrays,Strncpy,我正在尝试创建一个简单的数组扩展函数,该函数创建一个新数组,该数组的值与前一个数组扩展的值相同: char* test(char array[], int expandBy) { char newArray[sizeof(array) + expandBy]; strncpy(newArray, array, sizeof(array)); return newArray; } 但是,我得到了编译时错误表达式必须有一个常量值。我看到的所有类似问题的答案都建议使用宏,但

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

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

    return newArray;
}
但是,我得到了编译时错误
表达式必须有一个常量值。我看到的所有类似问题的答案都建议使用宏,但如果事先不知道值,我就不能使用宏


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

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

char *test(char *array, size_t current_size, size_t expand_size)
{
    char string[current_size + expand_size + 1];
    // Rest of your code
}
但是,如果从这个函数返回数组
字符串
,那将是一个错误,因为它只在函数中有效

我认为在继续用c编写代码之前,您需要阅读有关内存分配、数组和指针的内容,因为您显然还不具备所需的知识


另外,通常应避免使用
strncpy()
,因为该函数不保证使用
null
终止符,结果很容易得到一个非
null
终止的数组,您将假定该数组是字符串,但它当然是,不是。

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

char *test(char *array, size_t current_size, size_t expand_size)
{
    char string[current_size + expand_size + 1];
    // Rest of your code
}
但是,如果从这个函数返回数组
字符串
,那将是一个错误,因为它只在函数中有效

我认为在继续用c编写代码之前,您需要阅读有关内存分配、数组和指针的内容,因为您显然还不具备所需的知识


另外,一般来说,您应该避免使用
strncpy()
,因为该函数不保证使用
null
终止符,结果很容易得到一个非
null
终止的数组,您将假定该数组是字符串,但它当然不是。

我在代码中发现两个错误

首先,将数组传递给函数就是将指针传递给数组中的第一个元素。因此
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;
}
#包括
#包括
char*NewArray(char arr[],int arr\u size,int expand\u size)
{
int new_size=arr_size+expand_size;
char*new\u arr=malloc(sizeof(char)*new\u size);
strncpy(新的arr,arr,新的大小*大小(字符));
返回新的_arr;
}

我发现您的代码中有两个错误

首先,将数组传递给函数就是将指针传递给数组中的第一个元素。因此
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;
}
#包括
#包括
char*NewArray(char arr[],int arr\u size,int expand\u size)
{
int new_size=arr_size+expand_size;
char*new\u arr=malloc(sizeof(char)*new\u size);
strncpy(新的arr,arr,新的大小*大小(字符));
返回新的_arr;
}

您有一个比编译器错误更糟糕的问题:返回指向局部变量的指针。一旦函数返回,局部变量就会超出范围,这将给您留下一个指向不再存在的数组的错误指针。尝试取消引用返回的指针将导致。另一个不相关的注意事项是,在这种情况下,将不会添加终止符。注意这一点。一旦你将数组传递给函数,它就会衰减为指针。此时sizeof告诉您指针的大小,而不是数组的长度。如果是以null结尾的字符串,则可以使用strlen查找内容的长度,但这可能不是实际数组的长度@Someprogrammerdude:实际上,重要的是
newArray
对象的生存期,而不是其名称的范围。作用域是名称可见的位置。生命周期是对象存在的时间。顺便说一下,我怀疑OP不是用现代标准C版本编译的。我在他们的代码中没有看到任何表达式会生成关于常量值的错误。但是,如果他们使用的是不支持可变长度数组的C版本,他们将在
newArray
声明中得到该错误,因为它使用了维度的运行时值。因此OP出错的原因实际上与
sizeof(array)
不生成“array”的大小这一事实无关。您有一个比编译器错误更糟糕的问题:返回指向局部变量的指针。一旦函数返回,局部变量就会超出范围,这将给您留下一个指向不再存在的数组的错误指针。尝试取消引用返回的指针将导致。另一个不相关的注意事项是,在这种情况下,将不会添加终止符。注意这一点。一旦你将数组传递给函数,它就会衰减为指针。此时sizeof告诉您指针的大小,而不是数组的长度。如果是以null结尾的字符串,则可以使用strlen查找内容的长度,但这可能不是实际数组的长度@Someprogrammerdude:实际上,重要的是
newArray
对象的生存期,而不是其名称的范围。作用域是名称可见的位置。生命周期是指对象存在的时间。顺便说一下,我怀疑OP不是compi