在 SHM 段中分配字符串会破坏整个结构

Assigning string in SHM segment breaks the whole structure

我遇到了一个对我来说有点奇怪的问题。

快速概览:

#define LENGTH 2048

struct ShmBlock
{
   int value_1;
   char str[LENGTH];
}

int AssignStr(struct ShmBlock* shm, char* str)
{
   if(strlen(str) > LENGTH)
       return -1;
   strncpy(shm->str, str, sizeof(shm->str));
   return 0;
}

代码已简化,但我试图显示导致错误的代码行。首先,当然我建立了与 SHM 的连接,它似乎工作正常,我可以毫无问题地分配 int 值,但是当我调用 AssignStr() 时会发生一些奇怪的事情,一般来说,字符串不会被复制,并且每次尝试调用shm->str 以分段错误结束,第二件让我感到惊讶的事情是调用 AssignStr() 将我的 int 值更改为一些随机数。你知道这个问题的原因是什么吗?为什么这个错误会影响 int 值? 0.o

最有可能的是,当你第一次分配 ShmBlock 时,它是零,所以当你测试时

if (strlen(str) > strlen(shm->str))

strlen(shm->str) 是 0(NUL 中的第一个字符),因此您只需 return -1 而无需复制字符串。