#include <string> #include <iostream> using namespace std; int main() { char** pP = NULL; string str = 0; pP = (char**)calloc(128, sizeof(char*)); for (int i = 0; i < 128; ++i) { pP[i] = (char*)calloc(128, sizeof(char)); } pP[1000] = "ddd"; str = pP[1000];///这里会报错 printf("%s ", pP[1000]); return 0; } 以上代码去掉str = pP[1000];就正常运行可以输出ddd 这里怎么把pP[1000]赋值给str |
|
20分 |
string str(pP[1000]);
|
5分 |
pP = (char**)calloc(128, sizeof(char*));
相当于开辟了128个存放指针的指针数组,而pp是数组的首地址 for (int i = 0; i < 128; ++i) { pP[i] = (char*)calloc(128, sizeof(char)); } 每个数组里面的指针存放了一个char类型128字节的数组的地址 pP[1000] = “ddd”; str = pP[1000];///这里会报错 pp一共才分配了128个存放指针的数组空间,你确往1000个位置写指针值 肯定把这块堆内存空间 给破坏了! |
二师兄说的对啊
|
|
如果去掉 |
|
二师兄和三师兄说得对,补充一点,从异常信息看,p[1000]取到了0值,这个值又被你当指针用了,所以抛了null pointer
|
|
和我写的那种方式一样,在编译器调试就会报错,同样的错误我上面有图, 但问题是我用到mfc的项目里运行exe文件也报错的。 |
|
string str = 0; char **p = new char *[10]; p[0] = "aaa"; str = p[0]; printf("%s\n", str); 这样为什么错了 |
|
15分 |
string str = 0; char **p = new char *[10]; for (int i = 0; i < 10; ++i) { //加上这段内存分配 pP[i] = (char*)calloc(128, sizeof(char)); } p[0] = "aaa"; str = p[0]; printf("%s\n", str); |
这个我找到错误的地方了,是string str = 0;
错误 把整形复制给string类型 |
|
string str = "\0"; char **p = new char *[10]; p[0] = "aaa"; str = p[0]; printf("%s\n", str); 这样就不会有问题了 |