首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >char** args与char* args的区别

char** args与char* args的区别
EN

Stack Overflow用户
提问于 2013-02-27 08:27:53
回答 3查看 2.7K关注 0票数 1
代码语言:javascript
复制
char** args = (char**)malloc(MAX_ARGS*sizeof(char*));

代码语言:javascript
复制
char* args = (char*)malloc(MAX_ARGS*sizeof(char*));

请解释这两种类型的声明之间的区别。为什么我们需要2颗星,为什么需要1颗星?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-02-27 09:00:06

在这两种情况下,强制转换都是不必要的,并且可以掩盖错误;下面我将删除这些强制转换。(malloc()返回一个void*,它可以隐式转换为指向任何内容的指针。)

代码语言:javascript
复制
char **args = malloc(MAX_ARGS*sizeof(char*));

它将args定义为指向字符的指针,并将其初始化为指向一个足够容纳MAX_ARGS元素的内存块,每个元素都是一个char*。完成此操作后,您将需要为这些char*元素赋值,很可能是让它们指向字符串。

代码语言:javascript
复制
char *args = malloc(MAX_ARGS*sizeof(char*));

这是合法的,但几乎可以肯定是一个逻辑错误。args是一个指向字符的指针,这意味着它可以指向单个char对象,也可以指向char元素数组的第一个元素。但是您分配的内存可以容纳MAX_ARGS指针。

更有可能做的事情是:

代码语言:javascript
复制
char *s = malloc(MAX_LEN);

这将导致s指向可以保存MAX_LEN char元素(长度最大为MAX_LEN - 1的字符串)的内存区域。(请注意,根据定义,sizeof (char) == 1。)

有一个有用的技巧可以避免类型不匹配。对于任何类型的FOO,类型为FOO*的指针都需要指向足够大的内存块,以存储一个或多个类型为FOO的元素。如果你这样写:

代码语言:javascript
复制
ptr = malloc(count * sizeof *ptr);

并且ptr是一个FOO*,那么sizeof *ptrsizeof (FOO)是相同的--但是如果您稍后将ptr更改为pointer toBAR` `,则不必更新该行。

在你的例子中,指向的类型本身就是一个指针,所以你可以这样写:

代码语言:javascript
复制
char **args = malloc(MAX_ARGS * sizeof *args);

当您调用malloc时,您应该始终检查它是否成功,如果失败,则采取一些操作--即使该操作是终止程序并显示错误消息:

代码语言:javascript
复制
if (args == NULL) {
    fprintf(stderr, "malloc failed\n");
    exit(EXIT_FAILURE);
}
票数 3
EN

Stack Overflow用户

发布于 2013-02-27 08:31:39

这两个星号表示指针指向指针类型到数据类型。因此,在使用char**的情况下,这意味着创建一个char*MAX_ARGS数组。

因此,对于这种情况,以下内容是有效的,因为argsn是一个char*

代码语言:javascript
复制
args[0] = (char*)strdup("aaa");
args[1] = (char*)strdup("bbbb");
args[2] = (char*)strdup("ccccc");

注意:你应该记得在释放args之前释放数组的每个成员,否则指针就会丢失。

对于单星,它只是一个指向数据的指针,实际上您正在编写字符(charMAX_ARGS*sizeof*)

对于这个,argsn是一个char类型:

代码语言:javascript
复制
args[0] = 'a';
args[1] = 'b';
args[2] = 'c';

使用这个char-array,您将创建一个简单的字符数组,也称为c样式字符串。

票数 0
EN

Stack Overflow用户

发布于 2013-02-27 08:37:48

2颗星类似于矩阵(或二维数组)。第一个malloc只为第一行获得内存(您必须迭代它的元素,使第二个malloc为其他行保留空间)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15102061

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档