我试图使用内存操作在c中编写一个 vector 。编译器没有显示任何错误,但是如果我尝试从 vector 中打印一个元素,它只会崩溃。每当我尝试打印目标变量(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;
}

最佳答案

基本上,正确处理中的指针。它通过值传递,因此创建了指针的副本,并对其进行了修改(为此副本进行了内存分配),但是一旦退出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;
}

关于c - vector 在C崩溃,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32808747/

10-11 22:54
查看更多