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
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] = "[=11=]"; /*<- 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] = "[=11=]";
写入此类指针的内容将出现段错误。
您可能想改为执行 sprintf 或 strcpy 之类的操作,或者可能只是:
v->matrix[i][0]=0;
我有这个结构:
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
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] = "[=11=]"; /*<- 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] = "[=11=]";
写入此类指针的内容将出现段错误。
您可能想改为执行 sprintf 或 strcpy 之类的操作,或者可能只是:
v->matrix[i][0]=0;