奇怪的双指针更新内存位置
weird double pointer updating memory location
我运行下面的代码存储了一个二维方阵。代码读取每一行,将元素拆分 space 并将它们存储到矩阵的相应单元格中。
输入格式:
第一行包含一个整数n,表示矩阵中的行数和列数。
接下来的行表示矩阵的行,每行包含描述列的 space 分隔的整数。
用于测试的样本Input/Input:
5
11 2 4 2 3
4 5 6 -1 0
10 8 -12 8 7
1 2 4 -2 5
10 -2 1 0 2
程序:[=35=]
#include <assert.h>
#include <limits.h>
#include <math.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void printMatrix(int n, int **matrix){
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
printf("%d ",matrix[i][j]);
}
printf("\n");
}
}
int main(){
int size,length;
int **matrix,j;
char *buff=malloc(1000),*token;
fgets(buff,1000,stdin);
sscanf(buff,"%d",&size);
matrix=malloc(sizeof(int)*size);
for(int i=0;i<size;i++){
//Allocating memory for all the cells in ith row
matrix[i]=malloc(sizeof(int)*size);
buff='[=11=]';
buff=malloc(1000);
fgets(buff,1000,stdin);
length=strlen(buff);
if ((buff[length-1])=='\n'){
buff[length-1]='[=11=]';
}
j=0;
token=strtok(buff," ");
while(token){
matrix[i][j]=atoi(token);
token=strtok(NULL," ");
j++;
}
printf("\n");
printMatrix(i+1,matrix);
}
return 0;
}
收到输出:
11
11 2
4 5
11 2 4
4 5 6
10 8 -12
11 2 4 2
4 5 6 -1
10 8 -12 8
1 2 4 -2
869149824 22073 4 2 3
4 5 6 -1 0
10 8 -12 8 7
1 2 4 -2 5
10 -2 1 0 2
但是,在第 4 次迭代之后,我得到了垃圾值 869149824 22073。我不明白第一行是如何被修改的。
我知道我可能犯了一个愚蠢的错误,但我花了很多时间来弄清楚缺少什么here.I非常感谢任何帮助。
我借此机会编辑和清理了你的程序,你的垃圾打印问题如前所述是由你的内存管理引起的。
这是您程序的更新版本。
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
void printMatrix(int size, int i, int **matrix) {
printf("\n");
for (int y = 0; y <= i; y++) {
for (int x = 0; x < size; x++) {
printf("%d ", matrix[y][x]);
}
printf("\n");
}
}
int main() {
setvbuf(stdout, NULL, _IONBF, 0); // turn of buffering of stdout for debug.
int size;
int **matrix, j;
char buff[1000], *token;
fgets(buff, 1000, stdin);
buff[strcspn(buff, "\r\n")] = '[=10=]';
sscanf(buff, "%d", &size);
// allocate matrix
matrix = malloc(sizeof(int*) * size);
for (int i = 0; i < size; i++) {
matrix[i] = malloc(sizeof(int) * size);
}
for (int i = 0; i < size; i++) {
fgets(buff, 1000, stdin);
buff[strcspn(buff, "\r\n")] = '[=10=]';
j = 0;
token = strtok(buff, " ");
while (token) {
matrix[i][j] = atoi(token);
token = strtok(NULL, " ");
j++;
}
printMatrix(size, i, matrix);
}
return 0;
}
主要区别是:
buff
的静态分配
- 在进入扫描循环之前分配所有需要的内存。
- 更改打印函数以逐行打印矩阵。
我运行下面的代码存储了一个二维方阵。代码读取每一行,将元素拆分 space 并将它们存储到矩阵的相应单元格中。
输入格式:
第一行包含一个整数n,表示矩阵中的行数和列数。 接下来的行表示矩阵的行,每行包含描述列的 space 分隔的整数。
用于测试的样本Input/Input:
5
11 2 4 2 3
4 5 6 -1 0
10 8 -12 8 7
1 2 4 -2 5
10 -2 1 0 2
程序:[=35=]
#include <assert.h>
#include <limits.h>
#include <math.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void printMatrix(int n, int **matrix){
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
printf("%d ",matrix[i][j]);
}
printf("\n");
}
}
int main(){
int size,length;
int **matrix,j;
char *buff=malloc(1000),*token;
fgets(buff,1000,stdin);
sscanf(buff,"%d",&size);
matrix=malloc(sizeof(int)*size);
for(int i=0;i<size;i++){
//Allocating memory for all the cells in ith row
matrix[i]=malloc(sizeof(int)*size);
buff='[=11=]';
buff=malloc(1000);
fgets(buff,1000,stdin);
length=strlen(buff);
if ((buff[length-1])=='\n'){
buff[length-1]='[=11=]';
}
j=0;
token=strtok(buff," ");
while(token){
matrix[i][j]=atoi(token);
token=strtok(NULL," ");
j++;
}
printf("\n");
printMatrix(i+1,matrix);
}
return 0;
}
收到输出:
11
11 2
4 5
11 2 4
4 5 6
10 8 -12
11 2 4 2
4 5 6 -1
10 8 -12 8
1 2 4 -2
869149824 22073 4 2 3
4 5 6 -1 0
10 8 -12 8 7
1 2 4 -2 5
10 -2 1 0 2
但是,在第 4 次迭代之后,我得到了垃圾值 869149824 22073。我不明白第一行是如何被修改的。
我知道我可能犯了一个愚蠢的错误,但我花了很多时间来弄清楚缺少什么here.I非常感谢任何帮助。
我借此机会编辑和清理了你的程序,你的垃圾打印问题如前所述是由你的内存管理引起的。
这是您程序的更新版本。
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
void printMatrix(int size, int i, int **matrix) {
printf("\n");
for (int y = 0; y <= i; y++) {
for (int x = 0; x < size; x++) {
printf("%d ", matrix[y][x]);
}
printf("\n");
}
}
int main() {
setvbuf(stdout, NULL, _IONBF, 0); // turn of buffering of stdout for debug.
int size;
int **matrix, j;
char buff[1000], *token;
fgets(buff, 1000, stdin);
buff[strcspn(buff, "\r\n")] = '[=10=]';
sscanf(buff, "%d", &size);
// allocate matrix
matrix = malloc(sizeof(int*) * size);
for (int i = 0; i < size; i++) {
matrix[i] = malloc(sizeof(int) * size);
}
for (int i = 0; i < size; i++) {
fgets(buff, 1000, stdin);
buff[strcspn(buff, "\r\n")] = '[=10=]';
j = 0;
token = strtok(buff, " ");
while (token) {
matrix[i][j] = atoi(token);
token = strtok(NULL, " ");
j++;
}
printMatrix(size, i, matrix);
}
return 0;
}
主要区别是:
buff
的静态分配
- 在进入扫描循环之前分配所有需要的内存。
- 更改打印函数以逐行打印矩阵。