Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 共享内存有时不是空终止的_C_Memory Leaks_Shared Memory - Fatal编程技术网

C 共享内存有时不是空终止的

C 共享内存有时不是空终止的,c,memory-leaks,shared-memory,C,Memory Leaks,Shared Memory,但现在,有时它在这行代码中失败 我做错了什么 编辑:感谢您的支持!我想在你解释了strlen()+1==shm_大小之后,我已经修改了没有发布在这里的其余代码,看起来还可以。我正在等待新的故障,希望我不会得到任何故障;) 数组是0-原点,您需要: data[shm_size] = '\0'; 空终止字符的赋值: data[shm_size - 1] = '\0'; 正在写入已分配内存的末尾,这是未定义的行为。如果缓冲区中的字符数据长度shm_size,则需要将其复制到另一个缓冲区,以使其以n

但现在,有时它在这行代码中失败

我做错了什么


编辑:感谢您的支持!我想在你解释了strlen()+1==shm_大小之后,我已经修改了没有发布在这里的其余代码,看起来还可以。我正在等待新的故障,希望我不会得到任何故障;)

数组是
0
-原点,您需要:

data[shm_size] = '\0';

空终止字符的赋值:

data[shm_size - 1] = '\0';

正在写入已分配内存的末尾,这是未定义的行为。如果缓冲区中的字符数据长度
shm_size
,则需要将其复制到另一个缓冲区,以使其以null终止。

首先:内存不必以null终止。它在开始时没有定义。 你可能想考虑使用< /P>
data[shm_size] = '\0';
第二:

memset(data,0,shm_size);
有一个指标是错的。数组从零开始,因此应该使用

data[shm_size] = '\0';

数据[shm_size]
是一个超出末尾的数据。相反,您应该执行
data[shm_size-1]
,并且仅当
shm_size!=0

但是,调用strlen()只有在您确实在其中放入了字符串时才有意义。否则,如果碰巧有
\0
字符,它可能会返回任何值

data[shm_size-1] = '\0';
实际上,您正在访问共享内存边界之外的内存区域。。。指向原始内存块的指针上的
data[index\u value]
语法与

`data[shm_size] = '\0';` 

因此,
data[0]
将取消引用并返回共享内存段中第一个内存地址处的值,
data[shm_size]
将在共享内存段末尾处和地址处执行相同的操作。

演示如何为
数据定义和分配空间。我想是内存分配不正确导致的问题。对于
数据
数组,您可能需要多+1字节的空间。是的,您正在对非字符串的对象调用字符串函数。第一个问题是,在开始解决这个问题之前,您需要阅读更多内容。。。我确信它包含字符串,因为当我用gdb检查核心转储时,我可以看到数据的内容……你也可以看到大小吗?GDB可能只显示指定的数据量(比如x/3xb只显示3个字节)。即使“print”函数也可能不总是检查字符串的大小,而是打印到“\0”字符,它可能意外地在“string”之后,因此看起来是以NULL结尾的。不,在使gdb>set print elements 0后,在文本的末尾我可以看到地址xxx越界错误…这样,它总是使用100%的CPU。。。请注意,我的代码几乎总是很有魅力。。。但在某些情况下,它会出现故障…@edo888:请确保shm_大小大于零。如果它变为零,这可能是CPU使用率为100%的原因。如果共享内存一切正常,并且以null终止,那么strlen(data)==shm_size?内存是否应该始终填充。我只是在读。如果共享内存一切正常,strlen(data)==shm_size是否应该?shm_size应该是strlen(data)+1,因为您的末尾有'\0'字符。@edo888:内存并不总是填充的,您无法控制共享内存块末尾是否有内存,或者该内存将包含什么内容。从中读取(例如通过
strlen
)是未定义的行为。是的,一个新的共享内存缓冲区的内容最初都是零,但你不是在询问缓冲区的内容;您正在询问刚过缓冲区末尾的内存内容。感谢您的澄清!如果共享内存一切正常,并且以null结尾,strlen(data)=shm_size不应该吗?不,
strlen(data)
可以返回
shm_size
的唯一方法是调用未定义的行为,例如,在非以null结尾的缓冲区上调用
strlen
。与所有字符串缓冲区一样,在选择缓冲区长度时需要考虑空终止。如果共享内存一切正常,strlen(data)==shm_size是否应该?否,因为
strlen()
不包括空终止值。因此,存储以零结尾的字符串所需的内存块的实际最小大小需要等于
strlen()+1
。如果共享内存一切正常,并且以空结尾,strlen(data)==shm_size?@edo888不应该。如果内存区域未初始化,它可能包含任何随机垃圾,如所写,包含\0个停止计数的字符。
`data[shm_size] = '\0';` 
*(data + index_value*sizeof(unsigned char))