将字符串传递给从全局指针指向2D VLA字符串数组的strdup

时间:2016-07-14 17:44:00

标签: c arrays string

我以这种方式声明全局变量sym

extern char *sym; // in header.h
char *sym = NULL; // in main.c

//Then allocate memory within main()
char (*sym)[DIM_2_SYM][BUF_16] = malloc(sizeof(char[N][DIM_2_SYM][BUF_16]));
memset(sym, 0, sizeof sym);

但是,当尝试将字符串sym[i][j]传递给strdup时,请获取error: subscripted value is neither array nor pointer nor vector。我似乎传递了一个值而不是const char *,但不明白为什么:

char buf*;
buf = strdup(sym[1][0]);

2 个答案:

答案 0 :(得分:3)

大概是因为在main中定义了sym,所以在文件范围内主要定义了阴影sym

传递给strdup的参数是第一个sym类型char*

sym的大小,在这里使用:

memset(sym, 0, sizeof sym);

是指针的大小,因此memset不会将整个对象归零。 使用与分配中相同的方法:

memset(sym, 0, sizeof(char[N][DIM_2_SYM][BUF_16]));

甚至可以更好地将值存储在对象中,这样您就不会重复自己:

const size_t sym_bytes = sizeof(char[N][DIM_2_SYM][BUF_16]);

由于计算中涉及的数组大小都是常量,因此只需将全局变量定义为:

extern char sym[N][DIM_2_SYM][BUF_16]; // in header.h
char sym[N][DIM_2_SYM][BUF_16];

并且不需要分配。

或者您可以分配,在这种情况下,只能更改对象的外部大小:

extern char ( *sym )[DIM_2_SYM][BUF_16]; // in header.h
char ( *sym )[DIM_2_SYM][BUF_16] = NULL;  

int main( void )
{
    sym = malloc( sizeof( *sym ) * N );
}

N不必保持不变。

答案 1 :(得分:1)

提供的代码确实很混乱。

首先,这些本身很好并且一致:

extern char *sym; // in header.h
char *sym = NULL; // in main.c

这也是好的(在C中):

char (*sym)[DIM_2_SYM][BUF_16] = malloc(sizeof(char[N][DIM_2_SYM][BUF_16]));

但请注意,它声明了 local sym,与文件范围的 memset(sym, 0, sizeof sym); 不同,具有不同的类型。

这是合法的,但它没有达到你想要的效果:

sym

calloc()是一个指针;它的大小是指针的大小,大概是4或8个字节。假设您要对整个动态分配的空间进行零填充,最简单的方法是使用malloc()而不是sym来执行分配。它为你做零填充。

给出错误消息,这些语句的范围char buf*; buf = strdup(sym[1][0]);

char *

是文件范围,其类型为sym。对于 sym[1]char指定sym,第二个索引运算符不适用于此。另一方面,对于您提供分配的本地$(function () { $('input').iCheck({ checkboxClass: 'icheckbox_square-blue', radioClass: 'iradio_square-blue', increaseArea: '20%' // optional }); }); ,该代码是可以接受的。

您没有提供足够的信息来建议修复,但请注意,VLA不能具有文件范围。因此,您可能需要以不同的方式解决问题。