我正在尝试为我的C编程课程中的最终项目编程,但我遇到了一个我无法弄清楚的问题。我的代码是:
#include <stdio.h>
#include <stdlib.h>
char** allocateLevel(int sizeOfLevel);
int main(void)
{
char** level = allocateLevel(10);
int one, two;
for(one = 0 ; one < 10 ; one++)
{
for(two = 0 ; two < 10 ; two++)
{
level[one][two]='T'; //Crashes right here
}
}
printf("%c", level[4][5]); //tests to see if it prints
}
char** allocateLevel(int sizeOfLevel)
{
char **levelPointer;
levelPointer = (char **)malloc(sizeOfLevel * sizeof(char **));
int count = 0;
for(count = 0 ; count < sizeOfLevel ; count++)
{
levelPointer[count] = (char*) malloc(sizeOfLevel * sizeof(char*));
}
}
程序分配内存很好,但是当我尝试为其中一个元素赋值时它会崩溃。我无法弄清楚出了什么问题,我的教授没有多大帮助。有什么不对吗?
答案 0 :(得分:2)
在您的函数allocateLevel
中,您不会返回任何内容。因此,最终定义为level
的值几乎未定义。
return levelPointer;
的末尾添加allocateLevel
。(编辑)以及@Oli所说的 - 你的sizeof
都是间接的。{/ p>
答案 1 :(得分:0)
在行中:
levelPointer = (char **)malloc(sizeOfLevel * sizeof(char **));
我可以看到两个问题:
1) 您已投放malloc()
Good discussion Here 的回报率
2) sizeof(char **);
正在寻址依赖(== 8
(64位),== 4
(32位)。可能不是您预期的结果?)
sizeof
运算符计算变量或类型的字节数。您的用法是为您提供您不期望的结果:运行此示例:
int main()
{
cout << "Size of char ** : " << sizeof(char **) << endl;
cout << "Size of char : " << sizeof(char) << endl;
cout << "Size of int : " << sizeof(int) << endl;
cout << "Size of short int : " << sizeof(short int) << endl;
cout << "Size of long int : " << sizeof(long int) << endl;
cout << "Size of float : " << sizeof(float) << endl;
cout << "Size of double : " << sizeof(double) << endl;
cout << "Size of wchar_t : " << sizeof(wchar_t) << endl;
return 0;
}
通常在为char **
分配内存时,用法是创建一个字符串数组(又是char
的数组)。因为你正在为char **
分配内存看看这个作为分配内存的替代方案。它提供大小参数,并返回指针,其中包含按其他参数分配的内存。
用于创建记忆
char ** allocMemory(char ** a, int numStrings, int maxStrLen)
{
int i;
a = calloc(sizeof(char*)*(numStrings+1), sizeof(char*));
for(i=0;i<numStrings; i++)
{
a[i] = calloc(sizeof(char)*maxStrLen + 1, sizeof(char));
}
return a;
}
用于释放 完成时分配的内存。
void freeMemory(char ** a, int numStrings)
{
int i;
for(i=0;i<numStrings; i++)
if(a[i]) free(a[i]);
free(a);
}