我对 C 指针非常陌生,而且我来自 Java/C++。我正在尝试将 char* c 附加到 char** cArray。这是我到目前为止所拥有的:
char **cArray = "abc";
char *c = "def";
cArray += &c;
printf("%s", cArray)
输出应该是:abcdef
我的问题是,如何在 C 中将 char * 附加到 char ** ? 感谢您提供的任何提示!
最佳答案
您似乎对指针和数组是什么有误解。首先让我们从一个数组开始。数组是连续的固定大小的内存块。也就是说,数组是固定数量的彼此相邻的值。
因此,首先,“附加”数组的想法是有意义的,因为您可以将项目添加到数组中的下一个空白位置。但说阵列正在增长是不正确的。数组并不等同于 Java 的数组列表。
最后,我要指出静态数组的声明方式为:
int val[3];
其中 3
可以是解释为 size_t 的任何其他常量值。
接下来,我们来讨论指针。指针不是数组,不要混淆两者——尽管许多人认为它们是可以互换的(而且在大多数情况下你可以摆脱它!)。然而,这是其中一种情况并非如此。那么什么是指针?
指针表示内存中值的位置。因此,指针可以指向我们上面创建的val
数组中的一个元素。如果我们创建一个指针来指向 val
数组中的每个元素,并将它们全部打印到 stdout
,我们会看到它们彼此相距 4 个字节。这是因为数组的值彼此相邻(在内存中连续),并且 sizeof(int)
将返回 4(在我的系统上)。
您的主要误解似乎是指针需要指向任何东西。他们不。就像你可以有一个不包含任何信息的值(或者所有位都设置为 0)一样,你肯定可以有一个根本不指向任何地方的指针。事实上,这正是您所做的。
char **cArray = "abc";
char *c = "def";
cArray += &c;
printf("%s", cArray);
好吧,让我们逐行拆解一下。首先,声明一个名为 cArray
的 char **
并将其初始化为 "abc"
。好吧,你的变量 cArray
是一个指向指针的指针。我相信值“abc”
是一个const char*
。因此,您可能不想将指向字符的指针指定为指向指针的指针。结果是,值“abc\0”
将被解释为另一个内存地址。显然,这不会指向任何有用的内容,并且访问该内存将导致段错误。
接下来,将 c
初始化为包含 "def"
的 cstring。
最后,将 cArray
指向的地址增加 "def"
恰好位于的任何地址。所以现在,cArray
甚至不再指向 "abc"
(别介意错误地解释它)。
然后,我们尝试打印 cArray
指向的某个内存块,该内存块与我们的程序想要触及的任何位都相差甚远。
所有这些都说明了,假设我有两个 cstring,我想得到第三个,这样它就是第一个附加到第二个的后面:
char* a = "abc";
char* b = "def";
size_t sizeA = strlen(a);
size_t sizeB = strlen(b);
size_t size = sizeof(char) * (sizeA + sizeB + 1); //Size of our new memory block large enough to contain both a and b.
//Leave additional space for null terminator
char* c = malloc(size); //Actually allocate new memory
memcpy(c, a, sizeA); //Copy a into the first half of c
memcpy(c + sizeA, b, sizeB); //Copy b into the second half
c[sizeA + sizeB] = '\0'; //Assign null terminator to last character
printf("%s", c);
free(c); //Never forget
关于C:将 char* 附加到 char**,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36522609/