我想知道C++是如何为字符指针申请空间的保存的又是什么地址比如...

我想知道C++是如何为字符指针申请空间的保存的又是什么地址比如...,第1张

我自己的理解,如楼上前面的分析是对的

后面就有问题了:

照你那样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++指针的指针 动态分配空间等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9351957.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-27
下一篇2023-04-27

发表评论

登录后才能评论

评论列表(0条)

    保存