前段时间遇到了个问题,需要返回二维字符串数组,每行单独输出字符串。
正常思路利用两个for循环挨个对每个字符进行赋值。如下
for(int i = 0; i < x; i++)
{
for(int j = 0; j < y; j++)
{
char[i][j] = '*';
}
}
毕竟用两个for循环,太麻烦我尝试可不可以一次性赋值字符串上去。于是有了以下代码
char **date; //定义了指向数值指针
date = (char**)malloc(sizeof(char*)*5); //申请内存
for(int i = 0; i < 5; i++) //为每串字符申请内存
{
date[i] = (char*)malloc(sizeof(char)*5);
}
*(date+0) = "abcdefg"; //尝试赋值字符串,大小超过申请空间
printf("%s\n", date[0]); //打印结果 abcdefg
printf("%c\n", date[0][1]); //打印结果 b
//free(date[0]); //执行这段代码会报错 free():无效指针
*(date+1) = "zzzzzzzz";
printf("%s\n", date[1]); //打印结果 zzzzzzzz
printf("%c\n", date[1][6]); //打印结果 z
printf("%s\n", date[2]); //打印字符为空
//free(date[1]); //执行这段代码会报错 free():无效指针
free(date); //可以执行
所以说这样子赋值还是不行的
char 的赋值方式有两种,一种是字符赋值,一种是字符串赋值;
字符赋值如 char a[] ={ 'x' };
这个时候a[]只占一个字节
字符串赋值如 char a[] = "abcd";
这个时候a[]占五个字节,因为字符串赋值会在最后面多加一个'\0'表示字符串结束
调试了很久,最后只能用strcpy函数来解决这个问题。算是可以少用一遍for循环了,而且方便
strcpy函数需要调用头文件
#include<stdlib.h>
strcpy(date[0], "xxxxx");
接上述代码这样用就没什么问题了,free也不会报错了;