繁体   English   中英

在C中使用strcpy进行分段错误

[英]Segmentation Fault with strcpy in C

我有这个结构:

struct _window{
int bcolor; /* background color */
int fcolor; /* foreground color */
int x; /* x coordinate */
int y; /* y coordinate */
int sx; /* lenght */
int sy; /* high*/
char **matrix; /* Matrix with chars */
};

我用这个功能来初始化窗口

window* ini_window(int bcolor, int fcolor, int x, int y, int sx, int sy) {
window *v;
int i;

v = (window*) malloc(sizeof (window));
if (!v) /* CDE */
    return NULL;

v->bcolor = bcolor;
v->fcolor = fcolor;
v->x = x;
v->y = y;
v->sx = sx;
v->sy = sy;

/* allocate the matrix */
v->matrix = (char**) calloc(sy, sizeof (char*));
if (!v->matrix) { /* CDE */
    free(v);
    return NULL;
}

/* allocate the rows */
for (i = 0; i < sy; i++) {

    v->matrix[i] = (char*) calloc(sx + 1, sizeof (char));

    if (!v->matrix[i]) { /* CDE */
        free(v->matrix);
        free(v);
        return NULL;
    }

    v->matrix[i] = "\0"; /*<- delete this line to solve */
}
return v;

}

我尝试用该函数加载矩阵

int cargar_matriz_file(window*v, char *nom_file) {
int i;
char aux[100];
FILE *pf;

if (!v)
    return -1;
if (!v->matrix)
    return -1;
pf = fopen(nom_file, "r");
if (!pf) /* CDE */
    return -1;



for (i = 0; i < v->sy; i++) {
    fgets(aux, v->sx, pf);
    if (v->matrix[i]) {
        strcpy(v->matrix[i], aux); /* <-segmentation fault here */
        strtok(v->matrix[i], "\r\n");
    }
}
fclose(pf);
return 0;
}

但是在strcpy的一行中有一个错误,aux的长度正确,并且分配了v-> matrix [i],这可能是怎么回事?

在我看来,似乎您首先要分配malloc才能获得一些内存: v->matrix[i] = (char*) calloc(sx + 1, sizeof (char)); 然后通过将指针重新分配给常量字符串来泄漏该内存: v->matrix[i] = "\\0"; 写入此类指针的内容将产生段错误。

您可能想改做sprintf或strcpy之类的东西,或者可能只是: v->matrix[i][0]=0;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM