在C崩溃的传染媒介

时间:2015-09-27 14:03:38

标签: c vector crash

我尝试使用内存操作在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;
}

3 个答案:

答案 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)

代码的几个问题:

  1. vec->elemList = malloc(10*sizeof(typeSize));应为vec->elemList = malloc(10*typeSize);
  2. 如果您希望get创建指向int的指针,我建议您将其定义为int* get(myvector * vec, int index)并将新分配的指针返回int或在主要功能中使用:

    int b;
    get(&newVec, 0, &b);
    
  3. 后者也会避免内存泄漏。

      传递printf(*b);时,
    1. int错误,如果b为char*或printf,则printf("%d", b);要求int使用if b is a (&#34;%d&#34;, b); malloc int `

    2. 您经常使用free,但没有使用main。在这个特定的程序中,您不会因为{{1}}返回时操作系统将回收所有内存而导致内存泄漏。但请尽早考虑清除矢量的功能。