int row = 5;
int column = 10;
char **array;
int rowcount = 0;
array = (int **) malloc(sizeof(int *) * row);
char *x_ptr = array;
for (int i = 0; i < row; i++) {
array[i] = (int *) malloc(sizeof(int) * column);
x_ptr[i] = (int *) malloc(column * sizeof(int));
}
for (int i = 0; i < row; i++)
{
for (int j = 0; j < column; j++) {
if (j == 0) {
rowcount += 1;
char snum[5] = {'\0'};
sprintf(snum, "%d", rowcount); //converts int to char
for (int t = 0; t < strlen(snum); t++)
*(x_ptr + (i * column + j) + t) = snum[t];
} else {
*(x_ptr + (i * column + j)) = 0;
}
}
只是尝试向列0上的数组添加一些整数值。但是,当尝试添加数字(如10)时,sprintf命令将值拆分为snum [0] = 49'1'和snum [1] = 48' 0'。但是该数组仅接受snum [0],而snum [1]被完全忽略。
如果我对指针位置的理解不正确,请纠正我。
答案 0 :(得分:0)
好的,我已经尽力了,但是这段代码有很多错误,基本上是无法恢复的。请仔细看一下上面的注释,发布一些可编译的代码,告诉我们您期望它做什么,做什么做什么以及这两者之间的区别。
此谜题的核心可能是您正在使用两种不同的技术来访问二维数组。假设您要有一个包含n
行和m
列的整数数组。您可以这样声明:
int **array1 = malloc(n * sizeof(int *));
for (int a=0; a<n; a++)
array1[a] = malloc(m * sizeof(int));
通过这种方式,您可以将i
行和j
列中的整数作为array1[i][j]
来访问。
或者,您可以通过声明以下内容来做到这一点:
int *array2 = malloc(n * m * sizeof(int));
并以i
的形式访问行j
和列array2[i * m + j]
中的整数。
以下是一些应编译的代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int row = 5;
int column = 10;
// char **array; // declaration moved into main()
int rowcount = 0;
int main(void) { // added main() function
int **array = malloc(sizeof(int *) * row); // include type (int **); remove cast: (int **); moved into main()
int **x_ptr = array; // changed type to int **; moved into main()
// Allocate memory for array, so we can assign integers to
// array[i][j] where:
// i <= 0 < column
// j <= 0 < column
// Note that:
// array[i]
// is identical to:
// *(array + i)
// and:
// array[i][j]
// is identical to:
// *(*(array + i) + j)
for (int i = 0; i < row; i++) {
// array[i] = malloc(sizeof(int) * column); // removed cast, you're not using array[] anyway
x_ptr[i] = malloc(column * sizeof(int)); // removed cast
}
for (int i = 0; i < row; i++)
{
for (int j = 0; j < column; j++) {
if (j == 0) {
rowcount += 1;
// Create a character buffer.
char snum[5] = {'\0'};
// Write the text version of integer "rowcount" into the char
// buffer "snum"
sprintf(snum, "%d", rowcount); //converts int to char
// Copy the char value of each character into the
// two-dimensional integer array. We want to copy
// snum[t] into array[i][t]
for (size_t t = 0; t < strlen(snum); t++)
// *(x_ptr + (i * column + j) + t) = snum[t];
array[i][t] = snum[t];
} else {
// *(x_ptr + (i * column + j)) = 0;
array[i][j] = 0;
}
}
}
for (int i=0; i<row; i++)
for (int j=0; j<column; j++)
printf("Row %d, column %d has value %d\n", i, j, array[i][j]);
return 0;
}
我将文件另存为so.c
,并且正在使用以下命令对其进行编译:
gcc -o so -W -Wall -pedantic so.c
这会为您不想在原始代码中执行的许多操作打开警告。它可能无法解决您所遇到的确切问题,但应该可以为您提供一些帮助。