运行程序时为什么会出错?

时间:2017-03-27 01:02:22

标签: c pointers

我有一个错误,我找不到解决它的方法。我收到此错误

  

在0x504A3E6C(ucrtbased.dll)中抛出异常   ConsoleApplication3.exe:0xC0000005:访问冲突读取位置   0x0047617A。在第11行。

#include "Entities.h"
#include<assert.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

Expense* createExp(int nr_ap, float price, char* type) {
    Expense *e = malloc(sizeof(Expense));
    e->nr_ap = nr_ap;
    e->price = price;
    e->type = malloc(sizeof(char)*strlen(type) + 1);  #Here is the problem.
    strcpy(e->type, type);
    return e;
}

void destroy(Expense *e) {
    free(e->type);
    free(e);

}

int getAp(Expense *e) {
    return e->nr_ap;
}

float getPrice(Expense *e) {
    return e->price;
}

char* getType(Expense *e) {
    return e->type;
}

/*
Create a copy
*/

Expense *copyExp(Expense *e) {
    return createExp(e->nr_ap, e->price, e->type);
}

void testCreateExp() {
    Expense *e = createExp(10, 120, 'Gaz');
    assert(getAp(e) == 10);
    assert(getPrice(e) == 12);
    assert(getType(e) == "Gaz");
    destroy(e);

}

int main() {
    testCreateExp();
}

1 个答案:

答案 0 :(得分:6)

Expense *e = createExp(10, 120, 'Gaz');没有任何意义。单引号用于单个字符,而不是C字符串。

e.g。 char initial = 'G'; char* name = "Gaz";

试试Expense *e = createExp(10, 120, "Gaz");。大多数编译器应该警告您在这种情况下使用单引号是不正确的。

还怀疑你的断言不是正如预期的那样#34; assert(getType(e) == "Gaz"); - 不应该是strcmp()