0

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

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

4 回答 4

2

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

于 2011-05-16T09:23:56.093 回答
1

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

在 C 中,无法找到此信息,因此您必须手动管理此信息,例如通过使用size变量或(正如您已经完成的那样)使用的大小s1(仅当s1是数组时才有效)。

于 2011-05-16T09:23:43.113 回答
0

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

你在想什么 cud 可能实现如下:

s2=malloc(sizeof(s1)*sizeof(char *));

s2[0] = malloc(sizeof(s1[0])*sizeof(char))
.
.
.
.
n so on
于 2011-05-16T09:33:30.083 回答
0

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**,它实际上是一个 char* ,所以给出了一个 char* 的大小,它在我的机器上是 4 个字节。sizeofsizeof(s2)

如果你想将 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;
}
于 2011-05-16T09:55:14.177 回答