Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用指向存储在结构C中的数组的指针访问数组_C_Arrays_Struct - Fatal编程技术网

使用指向存储在结构C中的数组的指针访问数组

使用指向存储在结构C中的数组的指针访问数组,c,arrays,struct,C,Arrays,Struct,我有一个定义如下的结构: typedef char *element_t; typedef struct { element_t *array; /* start of the array */ int capacity; /* number of elements the array */ int length; /* used portion of array, 0..capacity */ } list; 我正在尝试访问*数组指向

我有一个定义如下的结构:

typedef char *element_t;

typedef
struct {
  element_t *array;     /* start of the array */
  int capacity;         /* number of elements the array */
  int length;           /* used portion of array, 0..capacity */
} list;
我正在尝试访问
*数组
指向的数组,并为其分配一个字符值并打印它

我对C有点生疏,但我正试图这样做:

list.array[0] = "a";
printf("%s\n", list.array[0]);
这使我的程序崩溃。有办法吗

编辑:我还应该提到,我也做了以下初始化:

element_t* array[LMAX];
list.array= *differentArray;

将初始化更改为:

element_t differentArray[LMAX];
list.array = &differentArray[0];

此更改后,代码的其余部分应按原样工作。您不需要任何进一步的分配,只要您只将像
“a”
这样的文本放入其中。

将初始化更改为:

element_t differentArray[LMAX];
list.array = &differentArray[0];

此更改后,代码的其余部分应按原样工作。您不需要任何进一步的分配,只要您只将像
“a”
这样的文本放入其中。

typedef char*element不要将指针隐藏在typedef后面,这是一种不好的做法,因为它会使代码不可读<代码>元素*数组
将与字符**数组相同。这真的是你想要的吗

list.array[0]=“a”表明您打算将“数组”作为指针数组?实际阵列分配在哪里?在哪里初始化结构?从发布的代码中可以看出,数组[0]指向的是la la land,而不是分配的内存


此外,指针数组的类型必须是
const char*
,因为您指向的是字符串文本。

typedef char*元素不要将指针隐藏在typedef后面,这是一种不好的做法,因为它会使代码不可读<代码>元素*数组
将与字符**数组
相同。这真的是你想要的吗

list.array[0]=“a”表明您打算将“数组”作为指针数组?实际阵列分配在哪里?在哪里初始化结构?从发布的代码中可以看出,数组[0]指向的是la la land,而不是分配的内存

此外,指针数组的类型必须是
const char*
,因为您指向的是字符串文本。

似乎适合我:

typedef char *element_t;

typedef
struct {
  element_t *array;     /* start of the array */
  int capacity;         /* number of elements the array */
  int length;           /* used portion of array, 0..capacity */
} list;

int main(int argc, char **argv)
{
    element_t array[2] = {"foo", "bar"};
    list list;
    list.array = array;
    list.capacity = sizeof(array)/sizeof(array[0]);
    list.length = 1;
    printf("%s\n", list.array[0]);
    return 0;
}
您很可能忘了指定
list.array
以指向有效数组。

似乎适合我:

typedef char *element_t;

typedef
struct {
  element_t *array;     /* start of the array */
  int capacity;         /* number of elements the array */
  int length;           /* used portion of array, 0..capacity */
} list;

int main(int argc, char **argv)
{
    element_t array[2] = {"foo", "bar"};
    list list;
    list.array = array;
    list.capacity = sizeof(array)/sizeof(array[0]);
    list.length = 1;
    printf("%s\n", list.array[0]);
    return 0;
}


您很可能忘记分配
list.array
以指向有效数组。

在访问
列表之前,您是否分配
list.array
以指向有效数组。数组[0]
刚刚在我最近编辑的OP
列表中解决了这个问题<代码>列表.数组[0]
是一个错误,因为
只能应用于对象。然而,如果变量实际上是一个类型,那么将其命名为与类型相同的变量是一种极其愚蠢的做法。这是C和AFAIK标准库没有定义列表类型。即使是C++,如果你发现自己使用命名空间的方式是完美的。你是否分配了<>代码>清单>数组<代码>,以在<代码>列表之前指向一个有效的数组。访问数组(0)< /代码>?刚刚在我最近的编辑中,在OP<代码>列表< /C>中的那个问题是一个类型的名称。代码>列表.数组[0]
是一个错误,因为
只能应用于对象。然而,如果变量实际上是一个类型,那么将其命名为与类型相同的变量是一种极其愚蠢的做法。这是C和AFAIK标准库没有定义列表类型。即使它是C++,如果你发现自己使用命名空间的方式是完美的。实际上,建议指向字符串时,将指针数组设为<代码> const char */COD>,但不是强制性的:在标准C中,字符串文字类型为<代码> char *<代码> @ JuHistar:是的,但这在C标准中是一个已知的“bug”。实际上,当指针指向字符串文字时,建议将指针数组设置为
const char*
,但不是强制性的:在标准C中,字符串文字的类型为
char*
@juhist Yes,但这是一个已知的“bug”在C标准中,如果我有一个字符串,我将使用strtok解析它,并且我希望将这些标记添加到数组中,该怎么办?我如何才能做到这一点?您需要动态分配内存。使用strdup(strtok(…)并记住检查内存分配是否成功(即未返回
NULL
),然后退出,并显示一条明确的错误消息“它失败了”。还记得
free()
strdup()
分配的内存。请注意,
strdup()
不在标准C中,但通常仍受支持
strtok
每次都返回相同的缓冲区,但会替换缓冲区内容,这就是为什么需要
strdup()
。strdup(strtok(…)做什么?我只是在谷歌上搜索了一下,但无法将它与这种特殊情况联系起来。
strdup()
分配一个新的内存块,该内存块由参数字符串填充。因此,它本质上将字符串保存在
strok()
使用的内存块中,该内存块稍后将在另一个
strok()
调用中被覆盖。看看为什么要这样做?我们不能在获取令牌时将其插入数组吗?如果我有一个字符串,我将使用strtok解析该字符串,并且我希望将这些令牌添加到数组中,该怎么办?我如何才能做到这一点?您需要动态分配内存。使用strdup(strtok(…)并记住检查内存分配是否成功(即未返回
NULL
),然后退出,并显示一条明确的错误消息“它失败了”。还记得
free()
strdup()
分配的内存。请注意,
strdup()
不在标准C中,但通常仍受支持
strtok
每次都返回相同的缓冲区,但会替换缓冲区内容,这就是为什么需要
strdup()