2017-01-01 23 views
-2

所以我想创建一个交换函数,动态地分配字符数组的大小。可能吗?是否推荐? 我的代码显示错误。编译器在VS2015(C编程)中显示“表达式必须有一个常数值”

void swap(void * vp1, void * vp2, int size) 
{ 
    char buffer[size]; //size must have a constant value is the error i am getting. 
    memcpy(buffer, vp1, size); 
    memcpy(vp1, vp2, size); 
    memcpy(vp2, buffer, size); 
} 
+3

可变长度数组本身不受支持。为C++或malloc使用一个向量C –

+0

为什么使用void指针?请选择C或C++ –

+0

我不知道C++ ...你能告诉我如何在这里使用Malloc吗? – Kyoko

回答

0
char buffer[size]; 

一个数组,其大小在编译时是不知道被称为一个可变长度数组。这些是仅限C的功能。由于这是一个错误,因此您正在使用C++编译器。您必须更改size,以便在编译时知道它。

以下是有效的C++阵列定义

#define NUM 8 
int a[16]; 
int a[NUM]; 

这是非法的构造:

int n; 
printf("What is your age?\n"); 
scanf("%d", &n); 

int a[n]; 

因为n取决于什么类型的用户。

的解决方案是将空指针参数投进去指针unsigned char,然后操纵unsigned char *

void swap(void *a, void *b, size_t n) 
{ 
    unsigned char *p = (unsigned char *) a, 
        *q = (unsigned char *) b, 
        tmp; 

    for (size_t i = 0; i < n; ++i) { 
     tmp = p[i]; 
     p[i] = q[i]; 
     q[i] = tmp; 
    } 
} 

但既然你用C++,它是一个更好的主意,使用模板。

+0

MS C++编译器允许VLA和MS C编译器不,因此在您的推理第一段可能不正确 –

0

不幸的是,MSVC是唯一不支持你的代码的主要C编译器。要支持所有的编译器,你可以写:

void swap(void * vp1, void * vp2, int size) 
{ 
    char *buffer = malloc(size); 
    if (buffer) 
    { 
     memcpy(buffer, vp1, size); 
     memcpy(vp1, vp2, size); 
     memcpy(vp2, buffer, size); 
     free(buffer); 
    } 
} 

注意:此方法是代码简单,但有可能是更有效的选择,特别是如果你通常只交换小缓冲区。

+0

它说void *的值不能分配给char的值* – Kyoko

+0

@Kyoko,这意味着你正在使用C++编译器。您需要弄清楚如何调用C编译器,或者将您的问题重写为C++问题。 –

相关问题