我不明白这件事。 关于 C 语言中的内存集
- 我
john
存储在array[]
. - 然后我创建了可以存储 10 个字符串的
char* megaArray[10]
。 - 我分配了
megaArray[0] = array
.所以john
存储在 0 的位置megaArray[]
. - 我打电话给
memset()
重置array[]
数组被清空。 -
如果我打电话给
memset()
array[]
,为什么tokens[0]
会被清空?
请帮忙,
这是代码
#include <stdio.h>
int main() {
char array[] = "john";
printf("%s is the namen",array);
char* megaArray[10];
megaArray[0] = array;
printf("%s is the name in mega Arrayn",megaArray[0]);
memset(array, ' ', sizeof(array));
printf("%s is the name after memsetn",array);
printf("'%s' is the name in mega Array after memsetn",megaArray[0]);
return 0;
}
赋值
megaArray[0] = array;
不会创建array
的副本。
相反,它megaArray[0]
指向(第一个元素)array
。它相当于:
megaArray[0] = &array[0];
从图形上看,它看起来像这样(在分配之后):
+--------------+ +----------+----------+-----+----------+ |超级阵列[0] |--> |阵列[0] |阵列[1] |... |阵列[4] | +--------------+ +----------+----------+-----+----------+ |超级阵列[1] |--> ? +--------------+ |... | +--------------+ |超级阵列[9] |--> ? +--------------+
char* megaArray[10];
是字符指针数组。所以当你分配
megaArray[0] = array;
你让第一个数组元素"指向"存储在变量中的字符串array
。它不会复制字符串。megaArray[0]
现在包含一个要array
的地址,其字面意思是同一内存位置的相同字符串。因此,memsetarray
会更改同一个字符串。
char* megaArray[10];
是简单的指针数组。
megaArray[0] = array;
,它会为指针megaArray[0]
分配array
的引用(地址)。它不会分配新内存或复制数据。
printf("'%s' is the name in mega Array after memsetn",megaArray[0]);
打印被memset
清零的array
,因为megaArray[0]
包含指向array
的指针
如果要复制保存在array
中的字符串
megaArray[0] = strdup(array);
或
megaArray[0] = malloc(sizeof(array));
memcpy(megaArray[0], array, sizeof(array));