我在创建动态字符数组时遇到问题。这是我到目前为止所做的。
char * arr;
arr = (char*)malloc (2 * sizeof (char));
它不是仅为2个字符分配空间,它让我进入arr [8]然后在8之后给我带来奇怪的错误。
我也试过制作一个二维char数组。第一个维度正确分配,但第二个维度的空间比我允许的空间大,并且大约12个字符左右会出现错误。任何帮助将不胜感激。如果可能的话,我更愿意制作一维动态数组。
答案 0 :(得分:1)
此行arr = (char*)malloc (2 * sizeof (char));
将仅为2个字节分配内存。但是你通过访问8个或8个以上的字节来覆盖内存。如果您访问两个以上的byes方法,它将给出一些不可预测的问题。如果您想要更多内存,请遵循以下代码。
#define USER_SIZE 10
arr = (char*)malloc ( USER_SIZE * sizeof (char));
在USER_SIZE
宏中分配值,然后根据需要分配内存。
2D指针(5 X 10)的示例
#define ROW 5
#define COLUMN 10
main()
{
unsigned char **p = NULL, colum = 0;
p = malloc ( ROW * sizeof ( unsigned char *) );
for (;colum< ROW; ++colum )
{
p[colum] = malloc (COLUMN * sizeof (unsigned char ));
}
}
答案 1 :(得分:0)
通过写malloc
调用分配的内存范围,您所做的是buffer overflow。编译器不进行边界检查(它假定您知道自己在做什么,并且只需为使用的内容付费)并允许您编译和运行。但是,它会导致未定义的行为,并且您的程序可能会崩溃。你不应该依赖这种行为。
程序员必须确保不要进行非法内存访问。你不应该投射malloc
的结果。此外,malloc
可能无法分配内存,在这种情况下,它会返回空值指针NULL
,您应该注意它。您可以将两个语句合并为一个。
int length = 8; // you can also use a macro
char *arr = malloc(length * sizeof *arr);
if(arr) {
// malloc call successful
// do stuff with arr
}