gcc 4.6.2 c89
为2D数组分配内存并填充字符。
但是,我似乎没有填写,因为我没有显示任何内容。
我在这里做错了吗?
char **attributes = NULL;
/* TODO: Check for memory being allocated */
attributes = malloc(3 * sizeof(char*));
int i = 0;
int k = 0;
for(i = 0; i < 3; i++) {
for(k = 0; k < 5; k++) {
sdp_attributes[i] = malloc(5 * sizeof(char));
sdp_attributes[i][k] = k;
}
}
for(i = 0; i < 3; i++) {
for(k = 0; k < 5; k++) {
printf("attributes[i][k] [ %c ]\n", attributes[i][k]);
}
}
非常感谢任何建议,
答案 0 :(得分:6)
两个主要问题:
第一期:
for(i = 0; i < 3; i++) {
for(k = 0; k < 5; k++) {
sdp_attributes[i] = malloc(5 * sizeof(char));
您在内循环的每次迭代中重新分配sdp_attributes[i]
- 从而每次都覆盖它。你可能想要这个:
for(i = 0; i < 3; i++) {
sdp_attributes[i] = malloc(5 * sizeof(char));
for(k = 0; k < 5; k++) {
第二期:
sdp_attributes[i][k] = k;
您基本上是在编写较低的ascii字符。其中大多数都不可打印。 这样的事情可能会做你想要的:
sdp_attributes[i][k] = k + '0';
答案 1 :(得分:3)
你可能想要:
for (i = 0; i < 3; i++)
{
attributes[i] = malloc(5 * sizeof(char));
for (k = 0; k < 5; k++)
{
attributes[i][k] = k;
}
}
这会忽略对分配的错误检查。
它还修复了数组的名称以匹配声明,但是你的代码没有编译(不发布非编译代码,除非你的问题是为什么它不能编译!)或者你有另一个名为sdp_attributes
的变量声明在某个你没有向我们展示的地方。
您的代码泄漏了大量内存。每次围绕k
- 循环,你分配了一个包含5个字符的新数组,并将指针存储在attributes[i]
(或sdp_attributes[i]
)中,将新指针存储在之前的位置,所以你覆盖了前4个指针的值。你不可能释放前四个项目 - 它们无可挽回地丢失了。此外,在最后一次迭代中,您初始化了最终数组的第5个元素,但之前的4个元素未初始化,因此包含不确定的垃圾。
此外,在您的打印循环中,数组中的值是控制字符^ @,^ A,^ B,^ C和^ D;这些不一定与%c
打印得很好(尤其不是^ @,也称为NUL或'\0'
)。 printf()
语句可能写得更好:
printf("attributes[%d][%d] [ %d ]\n", i, k, attributes[i][k]);
这将打印数组索引(而不仅仅是每个条目的字符[i][k]
),并将控制字符作为整数打印(因为char
值在传递时会被提升为int
到printf()
)而不是作为控制角色。
(对于一对嵌套循环使用i
和j
也更常规,并且i
,j
和k
用于三重嵌套但是,这是一个非常小的问题。)
答案 2 :(得分:1)
为2d数组分配和分配元素的正确方法如下(但这是int
数组,您可以尝试将其更改为char
数组:
有一点需要注意:正如@Mysticial所提到的,你应该在int
值中添加/减去'0',以便在使用char
字符集时获得ASCII
值(请记住我们的itoa()
功能!)。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int row, column;
int **matrix;
int i, j, val;
printf("Enter rows: ");
scanf("%d", &row);
printf("Enter columns: ");
scanf("%d", &column);
matrix = (int **) malloc (sizeof(int *) * row);
for (i=0 ; i<row ; i++)
matrix[i] = (int *) malloc (sizeof(int) * column);
val=1;
for (i=0 ; i<row ; i++) {
for (j=0 ; j<column; j++) {
matrix[i][j] = val++;
}
}
for (i=0 ; i<row ; i++) {
for (j=0 ; j<column; j++) {
printf("%3d ", matrix[i][j]);
}
printf("\n");
}
for (i=0 ; i<row ; i++)
free(matrix[i]);
free(matrix);
return 0;
}
几点需要注意:
malloc()
malloc()
'内存必须为free()
'ed 答案 3 :(得分:0)
for(i = 0; i < 3; i++) {
for(k = 0; k < 5; k++) {
sdp_attributes[i] = malloc(5 * sizeof(char));
sdp_attributes[i][k] = k;
}
}
每次循环进入最内层循环时,都会擦除已分配的内存。 这是一个正确的版本。
for(i = 0; i < 3; i++) {
sdp_attributes[i] = malloc(5 * sizeof(char));
for(k = 0; k < 5; k++) {
sdp_attributes[i][k] = k;
}
}
你应该修改你的声明:
attributes = malloc(3 * sizeof(char*));
到
sdp_attributes = malloc(3 * sizeof(char*));
不要忘记释放所有分配的内存
for(i = 0; i < 3; i++)
{
free(sdp_attributes[i]);
}
free(sdp_attributes);