我有一个意外的缓冲区溢出警告,为什么会这样?
I have an unexpected buffer overrun warning, why do I have that?
我必须创建一个函数,以这种方式对向量的分量求和:
- 第一+第二,
- 第三+第四,
- 5+6,依此类推
原始向量的大小为“大小”。
我必须动态创建一个大小为“size/2”的结果向量(因为这样求和我将原始向量大小减半)。
我使用了两个计数器,i 和 j,“i”是原始向量的计数器,“j”是向量“result”的计数器。我认为问题出在这里,因为我有缓冲区溢出警告。
这是我的代码:
#include <stdint.h>
#include <stdlib.h>
uint32_t* add_twobytwo(uint32_t* vect, size_t size) {
if (vect == NULL) {
return NULL;
}
uint32_t* result = malloc((size / 2) * sizeof(uint32_t));
if (result == NULL) {
return NULL;
}
size_t j = 0;
for (size_t i = 0; i < size; i += 2) {
result[j] = vect[i] + vect[i + 1];
j++;
}
return result;
}
int main(void)
{
size_t n = 6;
uint32_t* v = malloc(n * sizeof(uint32_t));
if (v == NULL) {
return NULL;
}
v[0] = 3; v[1] = 87; v[2] = 5; v[3] = 7; v[4] = 12; v[5] = 9;
uint32_t* sum = add_twobytwo(v, n);
free(v);
free(sum);
return 0;
}
绿色波浪线位于此处:
for (size_t i = 0; i < size; i += 2) {
result[j] = vect[i] + vect[i + 1];
j++;
}
我试图解释这个警告,结果 space 中似乎没有足够的 [=],但它工作正常并且它正确地完成了它的工作(我调试了 line-通过行说明这一点)。
您会收到警告,因为如果 size
是奇数,那么您将读取 vect
之后的元素。想象一下如果大小为 3 会发生什么:
- 首先,您有
i=0,j=0;
。
result[0] = vect[0]+vect[1];
j++
。 j 现在是 1。
i+=2;
。我现在2岁了。
result[1] = vect[2]+vect[3];
但是,因为 vect
的大小为 3,所以尝试读取 vect[3]
(你就是),将(很可能)产生分段错误。
我必须创建一个函数,以这种方式对向量的分量求和:
- 第一+第二,
- 第三+第四,
- 5+6,依此类推
原始向量的大小为“大小”。 我必须动态创建一个大小为“size/2”的结果向量(因为这样求和我将原始向量大小减半)。
我使用了两个计数器,i 和 j,“i”是原始向量的计数器,“j”是向量“result”的计数器。我认为问题出在这里,因为我有缓冲区溢出警告。
这是我的代码:
#include <stdint.h>
#include <stdlib.h>
uint32_t* add_twobytwo(uint32_t* vect, size_t size) {
if (vect == NULL) {
return NULL;
}
uint32_t* result = malloc((size / 2) * sizeof(uint32_t));
if (result == NULL) {
return NULL;
}
size_t j = 0;
for (size_t i = 0; i < size; i += 2) {
result[j] = vect[i] + vect[i + 1];
j++;
}
return result;
}
int main(void)
{
size_t n = 6;
uint32_t* v = malloc(n * sizeof(uint32_t));
if (v == NULL) {
return NULL;
}
v[0] = 3; v[1] = 87; v[2] = 5; v[3] = 7; v[4] = 12; v[5] = 9;
uint32_t* sum = add_twobytwo(v, n);
free(v);
free(sum);
return 0;
}
绿色波浪线位于此处:
for (size_t i = 0; i < size; i += 2) {
result[j] = vect[i] + vect[i + 1];
j++;
}
我试图解释这个警告,结果 space 中似乎没有足够的 [=],但它工作正常并且它正确地完成了它的工作(我调试了 line-通过行说明这一点)。
您会收到警告,因为如果 size
是奇数,那么您将读取 vect
之后的元素。想象一下如果大小为 3 会发生什么:
- 首先,您有
i=0,j=0;
。 result[0] = vect[0]+vect[1];
j++
。 j 现在是 1。i+=2;
。我现在2岁了。result[1] = vect[2]+vect[3];
但是,因为 vect
的大小为 3,所以尝试读取 vect[3]
(你就是),将(很可能)产生分段错误。