
我自己的理解,如楼上前面的分析是对的
后面就有问题了:
照你那样char p = new char [strlen(s)+1]; p = s;
肯定会发生内存泄露问题,你一开始申请了一段内存空间然后他的地址给了p存下来,后来p改成了s,所以申请的内存地址丢失。
至于你的问题:前面char p = "abc"中p指向的是字符串常量,所以系统自动分配且不浪费空间
而一般我们碰到的问题是不确定的,是变量,想要达到不浪费空间的效果只能用动态分配实现。
1、为指针p分配空间的方法有以下两种?
1 使用:p = q;(q指向一段空间)
2 使用:p = (char )malloc(100sizeof(char));
还可以有几个表示方式
char p="dasgdagsd";指向一段字符串的首地址
char p=&a;指向一个变量的首地址
char p;p=&a;同上第2个表达方式
问题补充:
2、另外在声明时使用:
char p = NULL与char p有区别么?
有区别
char p没有初始化,指针会自动随即指向一个内存中的地址,危险。
指针是用来保存地址的,所以指针是可以赋0值的,指针保存的是0的地址
问题补充2:
您的意思是不能使用char p = NULL;初始化了?但我可以用啊?
关于空指针前面我说错了,擦了免得误导别人了,这里重新说一下
char p = NULL;是可以当做初始化赋值的,这和直接定义指针不初始化唯一的区别就是
不初始化,指针将随便指向一个内存地址,地址里是有内容的。
初始化为NULL,是指向空地址,地址里是没有内容。
定义为空指针做什么用呢?我研究了一下,一般指针经常需要被频繁的申请内存空间和释放,内存释放用函数free,但是这个函数不会对指针造成影响,也就是说指针依然指向了一个被释放掉的内存空间,但是该空间不存在了,所以成了野指针也就是没有初始化的状态,指针变成随便指向了一个内存空间。
所以内存释放后需要做手动给指针赋null值的处理,让指针暂时指向一个空地址不会对程序造成错误。
当然这都是针对大型项目的。
p 要按2维数组形式动态分配:
例如:
// #define sizeX 3
// #define sizeY 20
// 分配前要知道 sizeX, sizeY 的大小
char p;
p= new char[sizeX];
for(int i = 0; i < sizeX; ++i) p[i] = new char[sizeY];
===============
你的 while 不知如何结束。
假定:
#include <iostream>
#include<string>
#include<vector>
using namespace std;
main(){
string s;
vector<string> str;
cin >> s;
strpush_back(s);
cin >> s;
strpush_back(s);
cout << strsize(); // 将得到 2
char p,q;
p=new char[strsize()]; // 能正确运行
//。。。。
}
假设我有一个叫testdll的动态库,其中有一个函数如下:
extern "C" int add(int a,int b,int c,int d,char PicPath)
{
FILE fp;
fp=fopen(PicPath,"wt");
for(int i=0;i
{
c[i]=a[i]+b[i];
fprintf(fp,"%d\n",c[i]);
}
fclose(fp);
return 1;
}
该函数的功能是a,b两个数组的值相加,和存放的数组c中,在将和写入到指定的文件,数组的维数
有传入的参数决定。
问题提出:
1Java中如何调用指针类型的参数;
2整形的参数可以直接传入吗?;
3PicPath为何是指针型的,怎么不是CString类型的;
4如何获取输入型参数的返回值;
Java调用动态链接库的代码如下:
JNative t= new JNative("testdll", "add"); //加载testdll文件,并调用add方法;
tsetRetVal(TypeINT); // 设置调用后的返回类型
// Java中构造指针,并为指针分配空间
Pointer a = new Pointer(MemoryBlockFactorycreateMemoryBlock(4 10));
Pointer b = new Pointer(MemoryBlockFactorycreateMemoryBlock(4 10));
Pointer c = new Pointer(MemoryBlockFactorycreateMemoryBlock(4 10));
Pointer strP= createPointer(100);
strPsetStringAt(0, "C:\\1txt");
int d=10;
// 为数组a和b赋值
for (int i = 0; i
asetIntAt(4 i, i);
bsetIntAt(4 i, i);
}
// 设置参数:
tsetParameter(0, a);
tsetParameter(1, b);
tsetParameter(2, c);
tsetParameter(3, d);
tsetParameter(4, strP);
tinvoke(); // 调用函数并执行
// 输出和的值,注意:一个整形值需要用4个字节存储,所以j前面需要乘以4
for (int j = 0; j
Systemoutprintln(cgetAsInt(4 j));
}
// 释放内存
adispose();
bdispose();
cdispose();
好了,这样一个完整的调用例子就结束了,我只是写出了程序中的关键的代码,具体的还需要写一
个类,并且继承一个基类,在复写基类中的方法,这些都比较简单,大家可以参考一下网上的其他
例子。
问题解答:
1Java中调用指针类型的参数:需要创建Pointer变量,并为其分配空间
2整形的数据可以直接传入;
3JNative对CString类型支持不是很良好,调用CString的方法时,经常会报一些异常,所以我把路径改成
的字符指针;
4输入型参数作为输出:可以参见以上的例子,数组c是如何设置和输出的。
以上就是关于我想知道C++是如何为字符指针申请空间的保存的又是什么地址比如...全部的内容,包括:我想知道C++是如何为字符指针申请空间的保存的又是什么地址比如...、为指针p分配空间的方法、C++指针的指针 动态分配空间等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)