首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >*arr[]和**arr之间的差异

*arr[]和**arr之间的差异
EN

Stack Overflow用户
提问于 2016-06-20 22:19:49
回答 4查看 3.8K关注 0票数 1

是一样的

代码语言:javascript
复制
char* s1[size];

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

他们有什么不同吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-06-20 22:54:12

理论上,*arr[]**arr是不同的。例如:

代码语言:javascript
复制
char *arr[size]; //case 1

这里,arr是一个大小为size的数组,其元素的类型为char*

然而,

代码语言:javascript
复制
char **arr; //case2

这里,arr本身就是指向char*类型的指针。

注意:在案例1中数组arr退化为指针成为类型char**,但它不可能反过来,即,指针在情况2不能成为数组。

票数 2
EN

Stack Overflow用户

发布于 2016-06-20 22:51:05

几乎没有什么区别:

  • s1不是一个lvalue,因此不能修改它(例如使用赋值或增量运算符)。正因为如此,它类似于char** const s1类型,后者也不允许修改(但在本例中,这是由const修饰符引起的)。
  • 用于数组地址的操作符&将返回数组的地址(即第一个元素的地址)。当&在变量上使用时,它将返回其地址: 断言((void*)&s1 == (void*)s1);断言((void*)&s2 != (void*)s2);
  • 数组上使用的sizeof()将返回数组大小,而指针上使用的sizeof()将返回指针大小-通常它将与sizeof(void*)相同,但C标准不需要这一点(请参阅下面的注释): assert( size on (S1) == size *size on(char*));assert(size on(S1) == size*size on(S1));//这是相同的断言(size on(S2) == size on(void*));//在某些平台上,这可能会失败。
  • 当然,很明显,s1是在堆栈上分配的,s2是在堆上分配的。因此,当执行离开当前范围时,s1将被自动销毁,而s2需要调用free来释放内存。

更新:下面是检查上述断言的示例代码:

代码语言:javascript
复制
#include <assert.h>
#include <stdlib.h>

int main()
{
    const int size = 22;

    char* s1[size];
    char** s2 = (char**)malloc(size * sizeof(char*));

    assert((void*)&s1 == (void*)s1);
    assert((void*)&s2 != (void*)s2);

    assert(sizeof(s1) == size * sizeof(char*));
    assert(sizeof(s1) == size * sizeof(s1[0])); // this is the same
    assert(sizeof(s2) == sizeof(void*)); // on some platforms this may fail

    free(s2);

    // Attempts to modify value
    char** const s3 = s1;
    ++s2; 
    //++s1; // compilation error - lvalue required as increment operand
    //++s3; // compilation error - increment of read-only variable ‘s3’

    return 0;
}
票数 -1
EN

Stack Overflow用户

发布于 2016-06-20 23:25:41

代码语言:javascript
复制
char* s1[size];

是在堆栈上分配的类型为char的指针数组。

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

是一个类型为char **的指针,该指针在堆栈上分配,但指向堆上分配的char *类型指针的动态数组。

这两种方法在范围和数组与指针之间的通常差异上存在差异。

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

https://stackoverflow.com/questions/37932739

复制
相关文章

相似问题

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