如何解决如何将双指针的地址传递给另一个双指针
| 如何将双指针的地址传递给另一个指针? 我有此代码,并且仅当我设置了注释行时,它才能正常工作。为什么大小不同?#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(){
char *s1[]={\"this\",\"is\",\"a\",\"test\"};
char **s2;
int i;
s2=malloc(sizeof(s1)*sizeof(char *));
s2=s1;
for(i=0;i<sizeof(s2)/sizeof(char *);i++)//for(i=0;i<sizeof(s1)/sizeof(char *);i++)
printf(\"%s\",*(s2+i));
return 0;
}
解决方法
注释行使用
sizeof(char*[4])
,大概是未注释行上sizeof(char**)
大小的四倍。
,使用sizeof
运算符时,将获得数组的大小(以字节为单位)。但是,当将其应用于指针时,将获得指针的大小,而不是指针指向的数据。
在C语言中,无法找到此信息,因此您必须手动进行管理,例如,使用size
变量或(如已经完成的)使用s1
的大小(仅当s1
是数组)。
,sizeof(s1)
给出外部数组中的字节总数,即指向字符串数组的四个指针的大小。在我的机器上,这提供了16个字节(每个指针为32位)。您对s1的声明等同于执行以下操作:
char *s1[4]={\"this\",\"is\",\"a\",\"test\"};
您可以自己查看这些sizeof结果:
printf(\"sizeof(char[4]) == %d\\n\",sizeof(char*[4])); // == 16
printf(\"sizeof(char**) == %d\\n\",sizeof(char**)); // == 4
因为s2
是char **,从sizeof
函数的角度来看,它实际上是char *,所以sizeof(s2)
给出了char *的大小,在我的机器上是4个字节。
如果要将s2分配给s1并打印出来,请尝试以下操作:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc,char* argv[])
{
char *s1[]={\"this\",\"teeeeeeeeeeest\"};
char **s2;
s2 = s1;
int numOfElementsInS1 = sizeof(s1)/sizeof(*s1);
for(int i = 0; i < numOfElementsInS1; i++)
{
printf(\"s2[%d] = %s\\n\",i,s2[i]);
}
return 0;
}
...应提供:
s2[0] = this
s2[1] = is
s2[2] = a
s2[3] = teeeeeeeeeeest
如果您的目标是复制s1的内容,那么您将需要以下内容:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc,\"teeeeeeeeeeest\"};
char **s2;
// Allocate memory for s2 and copy the array contents across
int numOfElementsInS1 = sizeof(s1)/sizeof(*s1);
s2 = (char**)malloc(sizeof(s1));
for(int i = 0; i < numOfElementsInS1; i++)
{
size_t bytesInThisString = strlen(s1[i]) + 1; // + 1 for the string termination
s2[i] = (char*)malloc(bytesInThisString);
memcpy(s2[i],s1[i],bytesInThisString);
}
// Print out s2
for(int i = 0; i < numOfElementsInS1; i++)
{
printf(\"s2[%d] = %s\\n\",s2[i]);
}
// Free up the memory
for(int i = 0; i < numOfElementsInS1; i++)
{
free(s2[i]);
}
free(s2);
return 0;
}
,sizeof(s1)
...给出总数。字节
您正在考虑的解决方案可以如下实现:
s2=malloc(sizeof(s1)*sizeof(char *));
s2[0] = malloc(sizeof(s1[0])*sizeof(char))
.
.
.
.
n so on
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。