我在我的C++程序中声明了以下结构:
struct person {
char name[10]; /* first name */
char id[10]; /* ID number */
off_t pos; /* position in file, for demonstration */
} people[] = {
{ "arnold", "123456789", 0 },
{ "miriam", "987654321", 10240 },
{ "joe", "192837465", 81920 },
};
j = sizeof(people) / sizeof(people[0]); /* count of elements */
Run Code Online (Sandbox Code Playgroud)
这里给出j = 3,即数组中没有元素; 总是即使你添加或减少元素......
但
char b[8];
i = sizeof(b)/sizeof(b[0]);
Run Code Online (Sandbox Code Playgroud)
在我的机器上给出i = a constant = 4的值.
现在这是合理的,因为sizeof(char*)在我的机器上是常量,而sizeof(char)也是常量.
但是一旦我声明了struct person,sizeof(person*)和sizeof(person)也应该是常量,并且它也应该产生一个常量值,不是吗?
这是一段无效的代码
struct a{
a mem; //Invalid as the compiler does not know how much memory to allocate
};
Run Code Online (Sandbox Code Playgroud)
但这是有效的:
class Date{
int d,m,y;
static Date Default_date; //Valid
};
Run Code Online (Sandbox Code Playgroud)
在Date数据类型甚至没有正确定义之前,编译器如何能够知道这里分配了多少内存!
这在某种意义上是否与其他静态定义不同?
我们可以在堆之外的其他地方放置动态分配的对象吗?我将如何定义一个重载的新运算符?
如果我有一些类竞技场
class Arena{
char area[2000];
public:
Arena(){}
};
Run Code Online (Sandbox Code Playgroud)
Arena my_arena(1000);
我想从Arena my_arena分配对象..
此外,与在性能等上从堆分配相比,这种内存分配有哪些可能的缺点?
我写了一个简单的程序:
#include<iostream>
#include<list>
using namespace std;
list<int>& func();
int main(){
list<int> a = func();
delete &a;
std::cout<<"Here\n";
}
list<int>& func(){
list<int>* ptr = new list<int>;
return *ptr;
}
Run Code Online (Sandbox Code Playgroud)
这个程序永远不会打印Here到cout流....
它只是崩溃..
我无法找到原因..