如何将内存分配给const char *数组

问题描述

以连续方式在整数数组中分配内存。但是如何将其分配给字符串数组。

假设我有这样的字符串数组:

const char *A[] = {"abcx","dbba","cccc"};

是否使字符串的每个字符都有其自己的地址。像这样:

1000 -> a
1001 -> b
1002 -> c
1003 -> x
1004 -> \0
1005 -> d
1006 -> b
1007 -> b
1008 -> a
1009 -> \0
.
.

执行此操作时。

char var = *(A+1) - *A + 1;
cout<<(*A+var)<<endl;

输出:“ bba”

那到底是怎么回事?

解决方法

const char *A[] = {"abcx","dbba","cccc"};不是字符串数组。它是指向字符串的指针数组。

对于"abcx""dbba""cccc"中的每一个,编译器都会创建并初始化char的数组,并为这些数组分配内存,通常是在程序的只读数据部分。它们可能以该顺序彼此相邻,可能以不同的顺序,或者可能分散并与其他数据混合。

然后const char *A[]A定义为指向char的指针的数组。编译器在计算初始化程序时将找出该数组中有多少个元素,并将为该数组分配空间。由于存在三个初始化程序,它将为三个char *类型的元素提供空间。

然后= {"abcx","cccc"}将使编译器将每个数组元素初始化为相应字符串的第一个字符。

A的总空间(您可以将其评估为(char *) &A[3] - (char *) &A[0])将是char *的空间的三倍,在使用C ++的C ++实现中,该空间将为12或24字节分别指向char的指针的四个或八个字节。

*(A+1) - *A + 1中,*(A+1)是数组A[1]的元素1。该元素是指向"dbba"的第一个字节的指针。 *A是数组A[0]的元素0,它是指向"abcx"的第一个字节的指针。由于编译器可以自行决定将这些字符串放在何处,因此我们通常不能期望它们之间有任何特定的关系,并且C ++并未定义将这两个指针相减的结果。

在使用平面(简单)地址空间的C ++实现中,*(A+1) - *A + 1可以自然方式对内存地址进行操作。 (这不能依靠,因为编译器不一定通过执行名义上表示的算术来实现该未定义的表达式。如果识别出未定义的行为,则编译器的优化可能会将其转换为任何其他代码。)如果在这样,随后类似地执行(*A+var)的求值,则结果实际上可以是*(A+1) - *A + 1 + *A = *(A+1) + 1,它是指向"dbba"的字符1的指针(开始从“ d”作为字符0)。因此输出为“ bba”就不足为奇了。