我尝试使用内存操作在c中编写一个向量。编译器显示没有错误,但如果我尝试从向量中打印一个元素,它就会崩溃。每当我尝试打印目标变量(printf((int )目的地))时程序再次崩溃。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
typedef struct{
void* elemList;
int elemSize;
int maxSize;
int curSize;
}myvector;
void initVec(myvector * vec, int typeSize){
vec->curSize = 0;
vec->maxSize = 10;
vec->elemSize =typeSize;
vec->elemList = malloc(10*sizeof(typeSize));
}
void add(myvector * vec, void* elem){
if(vec->curSize >= vec->maxSize){
vec->elemList = realloc(vec->elemList, vec->maxSize*2);
}
memcpy(&vec->elemList[vec->curSize],elem,vec->elemSize);
}
void get(myvector * vec, int index, void* destination){
if(index > vec->curSize || index < 0){
printf("Invalid Index");
return;
}
destination = malloc(vec->elemSize);
memcpy(destination,&vec->elemList[index], vec->elemSize);
}
int main()
{
myvector newVec;
initVec(&newVec,sizeof(int));
int a = 5;
add(&newVec,&a);
int* b;
get(&newVec,0,b);
printf(*b);//this is where the program crashes
return 0;
}
答案 0 :(得分:1)
基本上 get 中的指针未正确处理。它是通过值传递的,因此会生成指针的副本,修改副本(为此副本完成内存分配),但是一旦退出get方法,原始指针就不会指向有效的内存。你必须传递指针的地址。以下是修改后的代码(请注意 get 方法中目标中的双**)。基本上我传递“目标”指针的地址而不是指针本身。另外我修改了行sizeof(typeSize)..它应该只是typeSize,因为你已经用sizeof运算符调用了initVec方法。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
typedef struct{
void* elemList;
int elemSize;
int maxSize;
int curSize;
}myvector;
void initVec(myvector * vec, int typeSize){
vec->curSize = 0;
vec->maxSize = 10;
vec->elemSize = typeSize;
vec->elemList = malloc(vec->maxSize*typeSize);
}
void add(myvector * vec, void* elem){
if(vec->curSize >= vec->maxSize)
{
vec->elemList = realloc(vec->elemList, vec->maxSize*2);
}
memcpy(&vec->elemList[vec->curSize], elem, vec->elemSize);
vec->curSize++;
}
void get(myvector * vec, int index, void** destination){
if(index > vec->curSize || index < 0)
{
printf("Invalid Index");
return;
}
*destination = malloc(vec->elemSize);
memcpy(*destination, &vec->elemList[index], vec->elemSize);
}
int main()
{
myvector newVec;
initVec(&newVec,sizeof(int));
int a = 5;
add(&newVec,&a);
int* b;
get(&newVec, 0, &b);
printf("value of b is %d\n", *b); // This works correctly now
return 0;
}
答案 1 :(得分:0)
is_anagram? "rats", "star"
=> true
不应该是指向字符串的有效指针,因此会导致崩溃。
尝试按*b
为了做得更好,您应该printf("%d",*b);
free
分配的缓冲区。
<强>更新强>
malloc
函数错误,因为它抛弃了分配给get
的缓冲区
destination
函数和get
函数应该是这样的:
main
但这仍然给我分段错误。我正在努力。
更新2
你应该考虑每个元素的大小
您还忘记了void get(myvector * vec, int index, void** destination){
if(index > vec->curSize || index < 0){
printf("Invalid Index");
return;
}
*destination = malloc(vec->elemSize);
memcpy(*destination,&vec->elemList[index], vec->elemSize);
}
int main()
{
myvector newVec;
initVec(&newVec,sizeof(int));
int a = 5;
add(&newVec,&a);
int* b;
get(&newVec,0,&b);
printf("%d",*b);//this is where the program crashes
return 0;
}
功能中的尺寸信息
如果我们不关心内存泄漏,这段代码应该有用。
add
答案 2 :(得分:0)
代码的几个问题:
vec->elemList = malloc(10*sizeof(typeSize));
应为vec->elemList = malloc(10*typeSize);
如果您希望get
创建指向int
的指针,我建议您将其定义为int* get(myvector * vec, int index)
并将新分配的指针返回int
或在主要功能中使用:
int b;
get(&newVec, 0, &b);
后者也会避免内存泄漏。
printf(*b);
时, int
错误,如果b为char*
或printf,则printf("%d", b);
要求int
使用if b is a
(&#34;%d&#34;, b); malloc
int `
您经常使用free
,但没有使用main
。在这个特定的程序中,您不会因为{{1}}返回时操作系统将回收所有内存而导致内存泄漏。但请尽早考虑清除矢量的功能。