在基于vpp数据疏导平台环境开发时,vpp中自带的vec库使用。vec是一个动态数组。在对动态数组调用传参时,我传递给的是一级指针相当于该动态数组的首元素地址,编译通过,但是在实际运行时,报错Program received signal SIGSEGV, Segmentation fault.查了很久没有查到问题,最后查到应该经vec动态数组的首地址的地址传递给函数调用。
当动态数组首元素地址当做参数传递给函数时,调用函数的形参是拷贝了数组首元素地址,在该函数执行完会把形参释放掉,但是对本来的动态数组有什么影响,我具体还没有搞清楚。
报错时看到报错的地方是动态数组的元素内存访问不到。
找到答案了:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
char *str ;
}struct_t;
int test(struct_t *b)
{
struct_t *c = malloc(sizeof(struct_t)*2);
memcpy(&c[0], &b[0],sizeof(struct_t));
free(b);
b = c;
b[1].str = strdup("lijh");
return 0;
}
int main()
{
struct_t *s = malloc(sizeof(struct_t));
s[0].str = strdup("nihaoa!");
printf("front :%s\n", s[0].str);
test(s);
printf("after :%s\n", s[0].str);
printf("after :%s\n", s[1].str);
return 0;
}
因为vec中有动态扩展部分,当扩展长度时,会将数组的原来的空间释放掉,然后重新分配一块更大一点的空间导致地址发生了变化(因为传进来的地址已经被释放了,但是新申请空间的地址被赋予了形参),所以当该函数执行完之后,小南跟形参被释放,原来的指针的地址被修改,所以无法访问了。
这边文章给了我启发:https://blog.csdn.net/u012821868/article/details/89176014