特定内存地址中的 strcpy 返回值加垃圾

  • 本文关键字:返回值 strcpy 内存 地址 c
  • 更新时间 :
  • 英文 :


我需要将数据保存在指定的内存地址中,这些数据恰好是一个 4096 个字符的字符数组。

所以在这里我从uint32_t到空* ptrAddress 中获取内存地址

uint32_t number = 1268;
void* ptrAddress = &number;

在这里,我尝试复制 As 的数组,它有效! 但不是真的,因为我中间有一些垃圾

char tryArray[4096];
for(int i = 0; i < 4095; i++ ){
tryArray[i] = 'A';
}
//EDIT: added the null terminator (forgot to do that)
tryArray[4095] = '';
char* copy = strcpy(ptrAddress, (char*)tryArray);
printf("lets see: %sn", copy);

输出(想象 4096 As 和"垃圾"作为一些垃圾字符(:

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'garbage''garbage''garbage'AAAAAAAAAAAAAAAAA

在那之后我得到了一个赛格错误

我做错了什么?如果您还需要从代码或我的意图中了解更多内容,请告诉我!

你有几个问题。

首先,此代码:

uint32_t number = 1268;
void* ptrAddress = &number;

不会像您似乎表明您想要的那样指向内存地址1268的指针。它创建一个指向存储该1268的整数的指针。然后,您将大量超出该存储,导致未定义的行为,因此之后游戏就结束了。

如果需要指向特定内存地址的指针:

void *ptrAddress = (void *)0x1268;

但是,请确保该地址在您的环境/地址空间中是合法的!

其次,strcpy适用于以 null 结尾的字符串。如果您计划使用 4096 字节(非 null 终止(缓冲区,则可能应该使用memcpy。请注意,这意味着您无法使用 printf 进行打印(至少您尝试的方式(。

printf("%-4096s");

应该这样做。

最新更新