C:将 char* 附加到 char**

标签 c pointers

我对 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);

好吧,让我们逐行拆解一下。首先,声明一个名为 cArraychar ** 并将其初始化为 "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/

相关文章:

c - 学习C : video course recommendation

c - C 中删除数组中的空格?

c++ - int to void* - 避免 c 风格的转换?

c - 当前目录的权限

c - 返回主菜单时出现问题 - C 编程

c++ - 在 Arduino 中制作更好的循环

C在while条件内的函数内递增变量

c - 警告 : control reaches end of non-void function [-Wreturn-type] even if with "return 0;" in main function

java - Java中的指针逻辑

c++ - 链表/vector 中的指针