为什么以下代码输出4?
char** pointer = new char*[1];
std::cout << sizeof(pointer) << "\n";
Run Code Online (Sandbox Code Playgroud)
我有一个指针数组,但它应该有长度1,不应该吗?
class Foo {
public:
static const int kType = 42;
};
void Func() {
Foo *bar = NULL;
int x = bar->kType;
putc(x, stderr);
}
Run Code Online (Sandbox Code Playgroud)
这是定义的行为吗?我阅读了C++标准但是找不到任何关于访问静态const值的内容......我已经检查了GCC 4.2,Clang ++和Visual Studio 2010生成的程序集,并且它们都没有执行NULL的解引用指针,但我想确定.
const struct sockaddr FAR* name,
Run Code Online (Sandbox Code Playgroud) 示例代码:
#include <stdio.h>
int main (){
int *p;
{
int v = 1;
p = &v;
}
printf("%d\n", *p);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这段代码工作正常,但我不确定是否保证v的地址将被保留.
我的观察是,如果free( ptr )调用if ptr不是指向系统分配的内存的有效指针,则会发生访问冲突.让我们说我这样称呼free:
LPVOID ptr = (LPVOID)0x12345678;
free( ptr );
Run Code Online (Sandbox Code Playgroud)
这肯定会导致访问冲突.有没有办法测试指向的内存位置ptr是否是有效的系统分配内存?
在我看来,Windows操作系统内核的内存管理部分必须知道已分配了哪些内存以及剩余的内存用于分配.否则,它怎么知道是否有足够的内存来满足给定的请求?(修辞) 也就是说,似乎有理由断定必须有一个函数(或一组函数)允许用户确定指针是否是有效的系统分配内存.也许微软没有公开这些功能.如果微软没有提供这样的API,我只能假定它是出于故意和特定的原因.提供这样一个钩子进入系统是否会对系统安全造成重大威胁?
情况报告
虽然知道内存指针是否有效在许多情况下都很有用,但这是我的特殊情况:
我正在为新的硬件编写驱动程序,以替换通过USB连接到PC的现有硬件.我的任务是编写新的驱动程序,以便对当前驱动程序的现有API的调用将继续在使用它的PC应用程序中工作.因此,对现有应用程序唯一需要的更改是在启动时加载适当的驱动程序DLL.这里的问题是现有的驱动程序使用回调将接收到的串行消息发送给应用程序; 指向包含消息的已分配内存的指针通过回调从驱动程序传递到应用程序.然后,应用程序负责调用另一个驱动程序API,通过将相同的指针从应用程序传递给驱动程序来释放内存.在这种情况下,第二个API无法确定应用程序是否实际传回了指向有效内存的指针.
我有点困惑.我能找到的最好的东西是阅读cplusplus.com教程,他们不得不说出关于类的指针.
"创建指向类的指针是完全有效的.我们只需要考虑一旦声明,类就成为有效类型,所以我们可以使用类名作为指针的类型"
这告诉我什么时候在正常的实例化中使用它们.我已经多次看过 - >运算符,并查看了一些代码,但无法解释为什么会这样做.
通用的例子将不胜感激; 但更具体地说与gui编程有关.它是我第一次遇到它的地方.
QGridLayout *mainLayout = new QGridLayout;
mainLayout->addWidget(nameLabel, 0, 0);
mainLayout->addWidget(nameLine, 0, 1);
mainLayout->addWidget(addressLabel, 1, 0, Qt::AlignTop);
mainLayout->addWidget(addressText, 1, 1);
Run Code Online (Sandbox Code Playgroud)
为什么不
QGridLayout mainLayout
mainLayout.addWidget
...
Run Code Online (Sandbox Code Playgroud)
(如果我将示例代码更改为并且尝试了但是你得到了重点,它就不会编译)
提前致谢
在我开始我想讲清楚,我不想回答我的家庭作业的问题,我只是想,如果有人能真正解释正是我的教练在这种分配(最好是简单化版)要求,也许一个有用的推动正确的方向.我在这个话题上遇到了很多麻烦,每当我问导师时,我发现他比我更困惑我.
所以,这是作业:
1.添加一个新函数insertN(struct list*x,int num,int pos,int n),它将在pos位置插入n个整数num的副本,如果可能的话(如果pos太大,采取适当的行动) .我在这里感到困惑的主要是他所说的位置pos.
这是我正在使用的代码 - 由我的老师编写,我必须修改它.
#include<stdio.h>
#include<stdlib.h>
struct list {
int data;
struct list * next;
};
struct list *slist;
/*adds a node at the end of the linked list*/
void insert(struct list *x,int num){
/*if the list is empty*/
if(x==NULL){
/*create first node*/
slist=malloc(sizeof(struct list));
slist->data=num;
slist->next=NULL;
}
else{
/*go to the last node*/
while(x->next!=NULL) x=x->next;
/*add node at the end*/
x->next=malloc(sizeof(struct list));
x->next->data=num;
x->next->next=NULL;
}
}
void display(struct list *x){
/*traverse the …Run Code Online (Sandbox Code Playgroud) 只是想知道你认为什么是关于C++中矢量的最佳实践.
如果我有一个包含vector成员变量的类.该向量何时应声明为:
vector<MyClass> my_vector;vector<MyClass>* my_vector;vector<MyClass*> my_vector;vector<MyClass*>* my_vector;我在我的一个类中有一个特定的例子,我当前已将一个向量声明为case 4,即vector<AnotherClass*>* my_vector;
AnotherClass是我创建的另一个类.
然后,在我的构造函数的初始化列表中,我使用new创建向量:
MyClass::MyClass()
: my_vector(new vector<AnotherClass*>())
{}
Run Code Online (Sandbox Code Playgroud)
在我的析构函数中,我执行以下操作:
MyClass::~MyClass()
{
for (int i=my_vector->size(); i>0; i--)
{
delete my_vector->at(i-1);
}
delete my_vector;
}
Run Code Online (Sandbox Code Playgroud)
向量的元素添加到我的类的一个方法中.我不知道有多少物体会提前添加到我的矢量中.这是在代码执行时决定的,基于解析xml文件.
这是好习惯吗?或者是否应该将向量声明为其他情况1,2或3中的一个?
何时使用哪种情况?
我知道如果向量的元素是另一个类的子类(多态),则它们应该是指针.但是应该在任何其他情况下使用指针吗?
非常感谢你!!
我知道要使用的calloc请求内存,在所有位上写0,然后返回指向它的指针.
我的问题是:如果我使用包含指针的结构的calloc,那些指针会有NULL值还是我必须将它们设置为指向NULL?
struct a{
char * name;
void * p;
}* A;
Run Code Online (Sandbox Code Playgroud)
所以基本上,在我使用带有struct a的calloc之后,name和p会指向NULL吗?
谢谢!
char *p = "string"; //creates pointer to constant string
char p[] = "string"; //just an array with "string"
Run Code Online (Sandbox Code Playgroud)
我只是有点困惑为什么它在第一个例子中创建一个指向常量字符串的指针?它不应该仅仅是指向内存中带有"字符串"的地方的指针吗?