在 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 而无需复制字符串。
我遇到了一个对我来说有点奇怪的问题。
快速概览:
#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 而无需复制字符串。