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

标签 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。我看到的类似问题的所有答案都建议使用宏,但如果我事先不知道该值,我就不能使用宏。

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

最佳答案

这是因为将数组传递给函数实际上传递的是指针,所以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 终止的数组,您会假设它是一个字符串,但它当然不是。

关于c - 为什么我不能在 C 中使用函数参数作为数组大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47233758/

相关文章:

c - strcpy() 创建错误

c - C 上的单链表 - 警告 C4047

我可以使用 Valgrind 查找静态内存错误吗?

php - 获取符合特定范围条件的可能组合(大小为 N)

c - 打印函数变量时打印输出不同

c - strlen 没有产生正确的数字并且 strncpy 不起作用

ios - 如何在 iOS 运行时确定 ARMv8 功能?

c - K&R 1.5.4 C 中的字数统计

javascript - 有没有比 for 循环更好的方法将对象数组的属性添加到另一个数组?

javascript - 过滤对象日期时间的javascript数组,这样就没有重叠