memset() 被调用用于 array[].但是另一个数组在 C 中被清空



我不明白这件事。 关于 C 语言中的内存集

  1. john存储在array[].
  2. 然后我创建了可以存储 10 个字符串的char* megaArray[10]
  3. 我分配了megaArray[0] = array.所以john存储在 0 的位置megaArray[].
  4. 我打电话给memset()重置array[]数组被清空。
  5. 如果我打电话给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));

相关内容

最新更新