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 个字节。sizeof
sizeof(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;
}