Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.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_Malloc - Fatal编程技术网

这个C代码有漏洞吗?

这个C代码有漏洞吗?,c,malloc,C,Malloc,这个C代码有漏洞吗? 虽然答案是正确的,但我只是想知道这样写是否合适: // _mm_adds_epi16 : Adds the 8 signed 16-bit integers in a to the 8 signed //16-bit integers in b and saturates __m128i t7=_mm_adds_epi16( t5 ,t6 ); unsigned short *p= (unsigned short *)malloc(8); p=(unsigned sh

这个C代码有漏洞吗? 虽然答案是正确的,但我只是想知道这样写是否合适:

// _mm_adds_epi16 : Adds the 8 signed 16-bit integers in a to the 8 signed 
//16-bit integers in b and saturates
__m128i t7=_mm_adds_epi16(  t5 ,t6  );
unsigned short *p= (unsigned short *)malloc(8);
p=(unsigned short *)&t7;
for(int i=0;i<8;i++)
{
    printf("%d\n", p[i]);
}
更新

因此,我现在更新如下:

// _mm_adds_epi16 : Adds the 8 signed 16-bit integers in a to the 8 signed 
//16-bit integers in b and saturates
__m128i t7=_mm_adds_epi16(  t5 ,t6  );
unsigned short *p= (unsigned short *)malloc(8);
p=(unsigned short *)&t7;
for(int i=0;i<8;i++)
{
    printf("%d\n", p[i]);
}

 free(p);
我还有漏洞吗


打印t7的正确方法是什么?是的,存在泄漏。立即覆盖存储动态分配内存地址的指针。因此,内存不再可访问。

是的,存在泄漏。立即覆盖存储动态分配内存地址的指针。因此,内存不再是可访问的。

C中的每个malloc都需要有一些相应的空闲空间,这些空闲空间在终止之前是可访问的。任何异常都会构成内存泄漏

您将malloc的返回存储在p中,并通过覆盖它而丢失指针。因此,指针不可能被释放。在您的特定情况下,malloc本身是多余的,因为您没有以任何方式使用return

在回答您关于新代码是否存在内存泄漏的问题时,是的。malloc分配内存并返回指向已分配内存的指针。您正在通过覆盖指针的值而丢失指针,然后再也不使用分配的内存。更糟糕的是,您现在正在免费调用一个似乎是自动变量的未定义行为

如果打印工作正常,您可以执行以下操作:

__m128i t7 = _mm_adds_epi16(t5, t6);
unsigned short *p = (unsigned short *)&t7;
for(int i=0;i<8;i++) {
    printf("%d\n", p[i]);
}
malloc是冗余的,因为您甚至没有使用它分配的内存。

C中的每个malloc都需要一些相应的空闲空间,在终止之前可以访问这些空闲空间。任何异常都会构成内存泄漏

您将malloc的返回存储在p中,并通过覆盖它而丢失指针。因此,指针不可能被释放。在您的特定情况下,malloc本身是多余的,因为您没有以任何方式使用return

在回答您关于新代码是否存在内存泄漏的问题时,是的。malloc分配内存并返回指向已分配内存的指针。您正在通过覆盖指针的值而丢失指针,然后再也不使用分配的内存。更糟糕的是,您现在正在免费调用一个似乎是自动变量的未定义行为

如果打印工作正常,您可以执行以下操作:

__m128i t7 = _mm_adds_epi16(t5, t6);
unsigned short *p = (unsigned short *)&t7;
for(int i=0;i<8;i++) {
    printf("%d\n", p[i]);
}
malloc是冗余的,因为您甚至没有使用它分配的内存。

free将释放malloc分配的任何内存

这里您已经分配了8个字节的内存,并将该内存地址分配给了p

你只是给p分配了一个不同的内存地址;malloc返回的上一个内存地址已被覆盖。我们不再知道分配了8个字节的内存地址

free(p);
内存泄漏。它不再指向malloc分配的内存。

free将释放malloc分配的任何内存

这里您已经分配了8个字节的内存,并将该内存地址分配给了p

你只是给p分配了一个不同的内存地址;malloc返回的上一个内存地址已被覆盖。我们不再知道分配了8个字节的内存地址

free(p);


内存泄漏。它不再指向malloc分配的内存。

如果您以后不释放并删除p,那么是的!是的,如果您分配但不释放它,您将有一个泄漏。一般来说,您可以使用Valgrind的Memcheck工具来帮助您检测内存泄漏以及与内存相关的错误。这里有一个简短的介绍和快速指南:如果你以后不免费删除p,那么是的!是的,如果您分配但不释放它,您将有一个泄漏。一般来说,您可以使用Valgrind的Memcheck工具来帮助您检测内存泄漏以及与内存相关的错误。这里有一个简短的介绍和快速指南:@trumpetlicks:对我来说似乎是一个答案。有趣的是,我已经做了这件事,而得分同样高的人,给了我一个问题,把它作为一个答案而不是评论@小号:因为答案和评论之间存在差异。但这绝对不是一个评论。@trumpetlicks可能是这样的,也许你已经很辛苦了,但老实说,你怎么能说这不是一个答案呢?更新;我还有泄密吗?@trumpetlicks:对我来说似乎是个答案。有趣的是,我已经做了这件事,而得分同样高的人,给了我一个问题,把它作为一个答案而不是评论@小号:因为答案和评论之间存在差异。但这绝对不是一个评论。@trumpetlicks可能是这样的,也许你已经很辛苦了,但老实说,你怎么能说这不是一个答案呢?更新;我还有漏洞吗?更新:现在我已经释放了。现在可以了吗?@gpuguy:malloc是多余的,可以完全移除。现在我明白了,在我的原始代码中,malloc返回的原始内存将永远不会被释放,这就是neve
使用了r,这就是泄漏的原因。更新:现在我已经释放了。现在可以了吗?@gpuguy:malloc是多余的,可以完全移除。查看编辑。现在我明白了,在我的原始代码中,malloc返回的原始内存永远不会被释放,也永远不会被使用,这就是泄漏的原因。