【发布时间】:2019-04-09 12:51:37
【问题描述】:
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] 被完全忽略。
如果我对指针位置的理解有误,请指正。
【问题讨论】:
-
欢迎来到stackoverflow。请阅读:How to Ask 并发布minimal reproducible example。
-
使用 C 代码的第 1 步:将编译器设置为最高警告级别,并将所有警告视为错误。您的代码会生成多个警告,例如来自不兼容指针类型的赋值和赋值从没有强制转换的指针中生成整数。在尝试运行程序之前,您需要修复这些警告。
-
您不应该通过强制转换来消除警告(在使用
"%p"打印指针值时,(void*)除外)。如果您以其他方式进行投射以避免警告 - 您可能做错了什么。malloc的返回不需要强制转换,没有必要。见:Do I cast the result of malloc? -
1) 审查
char *x_ptr = array;2) 为什么声明char和char **array;然后分配给int和array[i] = (int *)malloc(sizeof(int)*column);?推荐array[i] = malloc(sizeof *(array[i]) * column);以避免此类类型不匹配。 -
"但是数组只接受 .." --> 这怎么知道的?很可能用于确定这一点的代码无法恢复打印
x_ptr[i][i]-x_ptr[i][i]is not a string without a null character。
标签: c pointers for-loop multidimensional-array