C中双指针的内存索引

C中双指针的内存索引,c,C,在下面的代码段中,第:p[1]=p[0]行包含什么内容?这是否意味着分配给p[0]的数据与p[1]位于同一地址?还有,当没有为p的每个特定索引分配内存时,如何利用索引呢?守则: int i,j; int **p = (int **)malloc(2 * sizeof(int *)); p[0] = (int *)malloc(2 * sizeof(int)); p[1] = p[0]; for(i = 0; i < 2; i++)

在下面的代码段中,第:p[1]=p[0]行包含什么内容?这是否意味着分配给p[0]的数据与p[1]位于同一地址?还有,当没有为p的每个特定索引分配内存时,如何利用索引呢?守则:

    int i,j; 
    int **p = (int **)malloc(2 * sizeof(int *)); 
    p[0] = (int *)malloc(2 * sizeof(int)); 
    p[1] = p[0]; 
    for(i = 0; i < 2; i++) 
        for(j = 0; j < 2; j++) 
            p[i][j] = i + j; 
    printf("%d",p[0][0]); 
    return 0;  
inti,j;
int**p=(int**)malloc(2*sizeof(int*);
p[0]=(int*)malloc(2*sizeof(int));
p[1]=p[0];
对于(i=0;i<2;i++)
对于(j=0;j<2;j++)
p[i][j]=i+j;
printf(“%d”,p[0][0]);
返回0;

我提前感谢你与我分享你的一部分智慧

这看起来像是试图创建一个大小为2x2的2D矩阵(如
p[行][列]
)。但是,实际上只分配了1行。然后
p[1]=p[0]表示第1行指向第0行。本质上,它是一个2x2矩阵,其中两行相同

这将分配两个“指向指针的指针”,允许您使用行索引
p[row]
,但此时这些行仍然指向垃圾:

int **p = (int **)malloc(2 * sizeof(int *));
然后分配实际的行内存,允许您使用列索引
p[row][column]

p[0] = (int *)malloc(2 * sizeof(int));
实现实际2x2矩阵的正确方法是首先为所有4个序列化值分配空间,如下所示:

p[0] = (int *)malloc(4 * sizeof(int));
然后让第1行指向第3个元素:

p[1]= &p[0][2];

这并不是说您应该以这种方式编写代码(有更好的方法),它只是对您提供的可疑代码的解释。

要创建2x2矩阵,您应该:

int i; 
int **p = malloc(2 * sizeof(int *)); 
for (i=0; i<2; i++)
    p[i] = malloc(2 * sizeof(int)); 
inti;
int**p=malloc(2*sizeof(int*);
对于(i=0;iQ1和IQ2:
p的定义如下:

int**p=(int**)malloc(2*sizeof(int*);
然后,
p[0]
p[1]
int*
所以当你这样做
p[1]=p[0]
时,你给
p[1]
赋值的值与
p[0]
相同,小心,指针被攻击,而不是它们所指向的值,因此如果在这之后你改变
p[1][i],
p[0][i]
也将被更改

为了更好地呈现这一点,我将尝试绘制以下记忆:

派遣前:

变量|内存地址

p[0]----指向---->0xXXXX(x为任意数)

p[1]----指向---->0xYYYY(y为任意数)

任务完成后:

p[0]----指向---->0xXXXX

p[1]----指向---->0xXXXX

问题3: 当
p[1]=p[0]
并且您以前分配了
p[0]
时,则
p[1]
指向内存中与以下内容一起分配的区域:

p[0]=(int*)malloc(2*sizeof(int));

因此不存在任何问题。如果删除
p[1]=p[0]
行,则应显示segfault。

p[1]
p[0]
现在指向相同的内存。保罗说的。要复制内存,请使用@marktheodore。如果您发现任何答案有用,请记住对它们进行投票,并接受最好的答案。此外,for循环似乎是错误的。它将写入
p[0][0]=0
然后
p[1][0]=1
p[1][0]
p[1][0]
指向同一个内存要使第1行指向您应该写入的第3个元素
p[1]=&p[0][2]
虽然你在做一些肮脏的把戏,但这并不干净。@Paulogilvi当然,我已经修复了它,但整个代码从一开始就是可疑和危险的。我只是用一些例子来回答一个模糊的问题,说明为什么它看起来非常错误。这是创建2x2矩阵的一种更通用/更干净的方法,但这不是两个任务中的任何一个另外,它也没有我的答案那么有效,我的答案是在一个连续的malloc中分配所有的“序列化”内存。