微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何将双指针的地址传递给另一个双指针

如何解决如何将双指针的地址传递给另一个双指针

| 如何将双指针的地址传递给另一个指针? 我有代码,并且仅当我设置了注释行时,它才能正常工作。为什么大小不同?
#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 举报,一经查实,本站将立刻删除。