是一样的
char* s1[size];至
char** s2 = malloc(size * sizeof(char*));他们有什么不同吗?
发布于 2016-06-20 22:54:12
理论上,*arr[]和**arr是不同的。例如:
char *arr[size]; //case 1这里,arr是一个大小为size的数组,其元素的类型为char*
然而,
char **arr; //case2这里,arr本身就是指向char*类型的指针。
注意:在案例1中数组
arr退化为指针成为类型char**,但它不可能反过来,即,指针在情况2不能成为数组。
发布于 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来释放内存。更新:下面是检查上述断言的示例代码:
#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;
}发布于 2016-06-20 23:25:41
char* s1[size];是在堆栈上分配的类型为char的指针数组。
char** s2 = malloc(size * sizeof(char*));是一个类型为char **的指针,该指针在堆栈上分配,但指向堆上分配的char *类型指针的动态数组。
这两种方法在范围和数组与指针之间的通常差异上存在差异。
https://stackoverflow.com/questions/37932739
复制相似问题