我正在尝试调试此函数,这是另一个程序的一部分,我从手表窗口中出现的指针str
得到一个“分段错误”错误出界。当我使用strcmp
和str
作为参数时,会发生错误。我究竟做错了什么?
char **merge(int R, int C, char ***mat)
{
char **tmp;
char *str;
int *trace, i=0, j, min;
tmp = (char **)malloc(R * C * sizeof(char *));
if(tmp == NULL)
{
fprintf(stderr, "Memory allocation error\n");
exit(EXIT_FAILURE);
}
trace = (int *)malloc(R *sizeof(int));
if(trace == NULL)
{
fprintf(stderr, "Memory allocation error\n");
exit(EXIT_FAILURE);
}
for(i = 0; i < R; i++)
{
trace[i] = 0;
}
i = 0;
while(i < (R*C))
{
for(j = 0; j < R; j++)
{
if(trace[j] < C)
{
if(strcmp(mat[j][trace[j]], str) < 0 )
{
str = mat[j][trace[j]];
min = j;
}
}
}
tmp[i++] = mat[min][trace[min]];
trace[min]++;
}
free(trace);
return tmp;
}
更新:为什么这是第二段代码,这是教授提供的解决方案,工作但指针也没有初始化?
/*
* merge the matrix rows into a sorted array
*/
char **merge_matrix(char ***matrix, int R, int C)
{
int i, j, min_idx, *idx;
char **array, *min_word;
/* allocate the final array, plus an auxiliary one */
array = (char **)malloc(R * C * sizeof(char *));
idx = (int *)calloc(R, sizeof(int));
if ((array == NULL) || (idx == NULL)) {
printf("Memory allocation error.\n");
exit(EXIT_FAILURE);
}
/* merge the matrix rows */
i = 0;
while (i < R*C) {
min_idx = -1;
for (j=0; j<R; j++) {
if (idx[j] < C) {
if ((min_idx==-1) || (strcmp(matrix[j][idx[j]], min_word)<0)) {
min_idx = j;
min_word = matrix[min_idx][idx[min_idx]];
}
}
}
array[i++] = matrix[min_idx][idx[min_idx]++];
}
free(idx);
return array;
}
答案 0 :(得分:2)
您声明了char *
:
char *str;
然后你把它作为函数strcmp()
的参数:
if (strcmp(mat[j][trace[j]], str) < 0)
然而str
在此期间没有给出任何价值,它是 undefined 。
答案 1 :(得分:1)
你老师的代码完全没问题,没有任何未初始化的指针访问。
在for
循环的第一次迭代中,变量min_idx
保证为-1(设置为上面几行的值)。通过一种称为短路评估的机制(如果您不知道它是什么,请查看它),strcmp
- if
部分的min_word
部分实际上会使用未初始化的指针min_idx
只会在for
除了-1之外的任何其他内容时进行评估。
在min_word
- 循环的任何后续迭代中,/* actionCreators.js */
export function refresh() {
return function(dispatch) {
return services.getData().then(response => {
return new Promise(resolve => {
dispatch(addData(response.data))
resolve()
})
})
}
}
/* myComponent.js */
refreshData = id => {
this.props.dispatch(refresh(id)).then(() => {
this.props.handleChange(id)
})
}
实际上已初始化。