【问题标题】:How to pass the address of a double pointer to another double pointer如何将双指针的地址传递给另一个双指针
【发布时间】:2011-05-16 09:17:40
【问题描述】:

如何将双指针的地址传递给另一个? 我有这段代码,只有在我设置注释行时它才能正常工作。为什么大小不一样?

#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;
}

【问题讨论】:

  • 你能准确描述一下你想先做什么吗?顺便说一句,s2=malloc(sizeof(s1)*sizeof(char *)); 行什么也不做,因为您将 s2 设置为下一行。
  • @Orka:我想将 s1 的地址传递给 s2,然后用 for 循环打印 s2。

标签: c pointers double-pointer


【解决方案1】:

注释行使用sizeof(char*[4]),大概是未注释行sizeof(char**)的四倍。

【讨论】:

  • 所以我无法使用 sizeof() 找到 s2 的大小。我应该手动制作吗?
【解决方案2】:

使用sizeof 运算符时,您将获得数组的大小(以字节为单位)。但是,当应用于指针时,您将获得 指针 的大小,而不是它指向的数据。

在 C 中,无法找到此信息,因此您必须手动管理此信息,例如通过使用 size 变量或(正如您已经完成的那样)使用 s1 的大小(这只会只要s1 是一个数组就可以工作)。

【讨论】:

    【解决方案3】:

    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","is","a","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, char* argv[])
    {
        char *s1[]={"this","is","a","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", i, s2[i]);
        }
    
        // Free up the memory
        for(int i = 0; i < numOfElementsInS1; i++)
        {
            free(s2[i]);
        }
        free(s2);
    
        return 0;
    }
    

    【讨论】:

      【解决方案4】:

      sizeof(s1)... 给出总数。字节数..

      你在想什么可以实现如下:

      s2=malloc(sizeof(s1)*sizeof(char *));
      
      s2[0] = malloc(sizeof(s1[0])*sizeof(char))
      .
      .
      .
      .
      n so on
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-05
        • 2011-08-23
        • 2011-05-19
        • 2020-12-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多