我有三个文件:
typedef struct {
int size_t;
char *c;
} p;
p ** createMatrix(int r, int c);
void printMatrix(p **matrix, const int r, const int c);
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "something.h"
p **
createMatrix(int r, int c)
{
int rowsize=r*2+1;
int colsize=c*2+1;
/* memory alloc of rows */
p **matrix=malloc(rowsize*sizeof(p *));
int k;
for(k=0; k<rowsize; k++)
{
/* memory alloc of columns */
matrix[k]=malloc(colsize*sizeof(p));
}
int i, j;
for(i=0; i<rowsize; i++)
{
for(j=0; j<colsize; j++)
{
/* columns is between letters */
if(j%2!=0)
{
matrix[i][j].size_t=7;
matrix[i][j].c=malloc(8*sizeof(char));
strcpy(matrix[i][j].c," ");
}
else if(i%2==0 && j%2==0)
{
matrix[i][j].size_t=1;
matrix[i][j].c=malloc(sizeof(char));
*(matrix[i][j].c)='a';
}
else
{
matrix[i][j].size_t=1;
matrix[i][j].c=malloc(sizeof(char));
*(matrix[i][j].c)=' ';
}
}
}
return matrix;
}
void
printMatrix(p **matrix, const int r, const int c)
{
int rowsize=r*2+1;
int colsize=c*2+1;
printf("\n");
int i, j;
for(i=0; i<rowsize; i++)
{
printf("\t");
for(j=0; j<colsize; j++)
{
if(matrix[i][j].size_t==1)
printf("%c", *matrix[i][j].c);
else
printf("%s", matrix[i][j].c);
}
printf("\n");
}
printf("\n");
}
#include <stdlib.h>
#include <stdio.h>
#include "something.h"
void
printMenufunction(p **matrix, int rows, int cols)
{
int rowsize=rows*2+1;
int colsize=cols*2+1;
/* memory alloc of rows */
matrix=malloc(rowsize*sizeof(p *));
int i;
for(i=0; i<rowsize; i++)
/* memory alloc of columns */
matrix[i]=malloc(colsize*sizeof(p));
matrix=createMatrix(rows, cols);
}
int
main(void)
{
int rows, cols;
p **matrix;
char stringtemp[3];
printf("ask for row and col in form (5x5):\n");
scanf("%s", stringtemp);
sscanf(stringtemp, "%dx%d", &rows, &cols);
printMenufunction(matrix, rows, cols);
printMatrix(matrix, rows, cols);
return 0;
}
此代码示例是我的prog的简化版本,这给我一个分段错误。我已经用gdb调试了它,所以我知道它在这些行之间的某个地方就是故障所在。我将非常感谢你的帮助,谢谢。
更新: 我无法调试此版本。我的旧编程有很多代码告诉我这是在这个区域,但至少我无法弄清楚在哪里?那就是为什么我不能发布究竟是哪一行会导致分段错误。如果我知道我认为我可以自己处理这个问题。我希望有人能比我更清楚地看到它。
答案 0 :(得分:1)
由于C是按值传递的语言,对函数参数的任何赋值仅修改参数的本地副本,因此当printMenufunction
返回时,matrix
仍未初始化。
您需要通过引用将指针传递给矩阵:
printMenufunction(&matrix, rows, cols);
printMatrix(&matrix, rows, cols);
并在函数内部取消引用。例如:
// v Pointer to the double-pointer
void printMenufunction(p ***matrix, int rows, int cols)
{
int rowsize=rows*2+1;
int colsize=cols*2+1;
/* memory alloc of rows */
// v Dereferencing the pointer
*matrix=malloc(rowsize*sizeof(p *));
// ...
}
答案 1 :(得分:1)
首先,它会帮助我们很多让你告诉我们哪些行gdb表示有错,而不只是说,“它就在这些行中的某个地方“。 gdb应该能够告诉你完全哪一行触发了错误。
话虽如此,这是一个候选人:
char *stringtemp;
printf("ask for row and col in form (5x5):\n");
scanf("%s", stringtemp);
stringtemp
尚未被分配到任何有意义的地方;你所拥有的只是一个指针,其初始值是不确定。这是一个潜在的段错误。为stringtemp
分配缓冲区指向,或者只是将其分配为char
的数组:
char stringtemp[SOME_SIZE]; // where SOME_SIZE is as big as you need.
为什么要在printMenuFunction
中分配矩阵?!你为什么不使用你的createMatrix
功能?!
修改强>
我讨厌变老;我完全错过了从createMatrix
调用printMenuFunction
(这意味着malloc
中的printMenuFunction
次来电是多余的,需要删除。
重写您的printMenuFunction
,如下所示:
void printMenuFunction(p ***matrix, int rows, int cols)
{
*matrix = createMatrix(rows, cols);
}
请注意,在该函数中,如果您需要访问matrix
的元素,则需要在应用下标之前取消引用它,例如
(*matrix)[i][j].size = ...;
重写您的main
,如下所示:
int
main(void)
{
int rows, cols;
p **matrix;
char stringtemp[3]; // 3 is not big enough to hold a string like "5x5";
// that requires an array size of *at least* 4.
// "10x10" would require 6 characters. You need
// an extra character for the 0 terminator.
printf("ask for row and col in form (5x5):\n");
scanf("%s", stringtemp);
sscanf(stringtemp, "%dx%d", &rows, &cols);
printMenufunction(&matrix, rows, cols); // note the & in front of matrix
printMatrix(matrix, rows, cols);
return 0;
}