gpt4 book ai didi

想要c指针解释

转载 作者:行者123 更新时间:2023-11-30 18:03:59 24 4
gpt4 key购买 nike

我是关于指针的新手,有人可以向我解释以下代码中输出的不同之处吗?在下面的代码中,我将一些值分配给 3d 指针。我在作业后打印了它们。然后再次将它们打印在不同的 block 中。为什么输出不同?

#include<stdio.h>
#define row 5
#define rw 3
#define col 10

char ***ptr,sh[10];
int i,j,k;

int main()
{
ptr=(char *)malloc(row*sizeof(char *));

for(i=0;i<row;i++)
{
*(ptr+i)=(char *)malloc(rw*sizeof(char *));
printf("\t:\n");

for(j=0;j<rw;j++)
{
*(*(ptr+i)+j)=(char *)malloc(col*sizeof(char *));

if(i==0 && j==0)
{
// *(*(ptr+row)+rw)="kabul";
**ptr="zapac";
}
else
{
sh[0]=i+48;
sh[1]=',';
sh[2]=j+48;
sh[3]='\0';
*(*(ptr+i)+j)=sh;
}

printf("\t%d%d = %s\n",i,j,ptr[i][j]);
}
printf("\n");
}

for(i=0;i<row;i++)
{
for(j=0;j<rw;j++)
{
printf("\t%d%d %s\n",i,j,ptr[i][j]);
}
printf("\n");
}
return 0;
}

输出是:

    :
00 = zapac
01 = 0,1
02 = 0,2

:
10 = 1,0
11 = 1,1
12 = 1,2

:
20 = 2,0
21 = 2,1
22 = 2,2

:
30 = 3,0
31 = 3,1
32 = 3,2

:
40 = 4,0
41 = 4,1
42 = 4,2

我的问题是,为什么以下输出与上面的输出不一致?

    00 zapac
01 4,2
02 4,2

10 4,2
11 4,2
12 4,2

20 4,2
21 4,2
22 4,2

30 4,2
31 4,2
32 4,2

40 4,2
41 4,2
42 4,2

最佳答案

您获得输出的原因是您的 *(*(ptr+i)+j) = sh 正在设置所有 char * s(除了第一个,你已经特殊处理过)为相同的值,即sh中数组数据的地址。 sh 只有一份副本,即其数组数据的一份副本;您的所有 char * 都指向该单个副本。当您稍后打印这些值时,您只是通过不同的指针一遍又一遍地打印相同的数据副本 - 因此您将获得上次修改时放入 sh 的内容它而不是您设置指针时其中的内容。

您可能希望每个 char * 获得数组的新副本,而不是仅仅指向 sh,但如果这就是您想要的,则必须复制自己数据。

所以...如果你替换这一行:

*(*(ptr+i)+j)=sh;

类似:

*(*(ptr+i)+j)=malloc(sizeof(sh));
strcpy( *(*(ptr+i)+j), sh );

ptr[i][j] = calloc(1,sizeof(sh));
strcpy( ptr[i][j], sh );

您将得到您所期望的结果,因为每个 char * 都将指向复制时 sh 中的字符串的新副本。不过,您需要记住稍后释放它们以及您 malloc() 编辑的其他所有内容。

大多数 malloc() 行也不正确,但由于 char *char **char *** 在您的系统上可能都是相同的大小,无论如何它都可以工作。

ptr=(char *)malloc(row*sizeof(char *));

应该是

ptr = (char ***)malloc(row*sizeof(char **));

因为您要分配一个 char ** 数组(指向 char 的指针),该数组是通过 char *** 访问的code>(指向指向char的指针的指针)。同样:

*(ptr+i)=(char *)malloc(rw*sizeof(char *));

应该是

*(ptr+i)=(char **)malloc(rw*sizeof(char *));

ptr[i] = (char **)malloc(rw * sizeof(char *));

分配通过char **(指向指针char)。

malloc() 调用前面的转换实际上是可选的 - malloc()void * 结果将被转换无论如何,无论您将其分配给什么指针类型。不过,在这种情况下,进行强制转换应该会让编译器警告您类型错误。

关于想要c指针解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7867471/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com