char** args = (char**)malloc(MAX_ARGS*sizeof(char*));和
char* args = (char*)malloc(MAX_ARGS*sizeof(char*));请解释这两种类型的声明之间的区别。为什么我们需要2颗星,为什么需要1颗星?
发布于 2013-02-27 09:00:06
在这两种情况下,强制转换都是不必要的,并且可以掩盖错误;下面我将删除这些强制转换。(malloc()返回一个void*,它可以隐式转换为指向任何内容的指针。)
char **args = malloc(MAX_ARGS*sizeof(char*));它将args定义为指向字符的指针,并将其初始化为指向一个足够容纳MAX_ARGS元素的内存块,每个元素都是一个char*。完成此操作后,您将需要为这些char*元素赋值,很可能是让它们指向字符串。
char *args = malloc(MAX_ARGS*sizeof(char*));这是合法的,但几乎可以肯定是一个逻辑错误。args是一个指向字符的指针,这意味着它可以指向单个char对象,也可以指向char元素数组的第一个元素。但是您分配的内存可以容纳MAX_ARGS指针。
更有可能做的事情是:
char *s = malloc(MAX_LEN);这将导致s指向可以保存MAX_LEN char元素(长度最大为MAX_LEN - 1的字符串)的内存区域。(请注意,根据定义,sizeof (char) == 1。)
有一个有用的技巧可以避免类型不匹配。对于任何类型的FOO,类型为FOO*的指针都需要指向足够大的内存块,以存储一个或多个类型为FOO的元素。如果你这样写:
ptr = malloc(count * sizeof *ptr);并且ptr是一个FOO*,那么sizeof *ptr与sizeof (FOO)是相同的--但是如果您稍后将ptr更改为pointer toBAR` `,则不必更新该行。
在你的例子中,指向的类型本身就是一个指针,所以你可以这样写:
char **args = malloc(MAX_ARGS * sizeof *args);当您调用malloc时,您应该始终检查它是否成功,如果失败,则采取一些操作--即使该操作是终止程序并显示错误消息:
if (args == NULL) {
fprintf(stderr, "malloc failed\n");
exit(EXIT_FAILURE);
}发布于 2013-02-27 08:31:39
这两个星号表示指针指向指针类型到数据类型。因此,在使用char**的情况下,这意味着创建一个char*MAX_ARGS数组。
因此,对于这种情况,以下内容是有效的,因为argsn是一个char*
args[0] = (char*)strdup("aaa");
args[1] = (char*)strdup("bbbb");
args[2] = (char*)strdup("ccccc");注意:你应该记得在释放args之前释放数组的每个成员,否则指针就会丢失。
对于单星,它只是一个指向数据的指针,实际上您正在编写字符(charMAX_ARGS*sizeof*)
对于这个,argsn是一个char类型:
args[0] = 'a';
args[1] = 'b';
args[2] = 'c';使用这个char-array,您将创建一个简单的字符数组,也称为c样式字符串。
发布于 2013-02-27 08:37:48
2颗星类似于矩阵(或二维数组)。第一个malloc只为第一行获得内存(您必须迭代它的元素,使第二个malloc为其他行保留空间)。
https://stackoverflow.com/questions/15102061
复制相似问题