我正在尝试创建一个简单的数组扩展函数,该函数创建一个新数组,其值与先前通过值扩展的数组相同:
char* test(char array[], int expandBy) {
char newArray[sizeof(array) + expandBy];
strncpy(newArray, array, sizeof(array));
return newArray;
}
但是,我收到编译时错误expression must have a constant value
。我在类似问题上看到的所有答案都建议使用宏,但如果我事先不知道这个值,我就不能使用宏。
有谁知道如何解决这个问题,或者是否有替代方法?
答案 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;
}