给定一个非连续的STL容器(您也可以考虑boost::unordered_map并boost::multi_index_container考虑),如果没有删除任何元素,是否保证容器内元素的内存地址永远不会改变(但是可以添加新的容器)?
例如
class ABC { };
//
//...
//
std::list<ABC> abclist;
ABC abc;
abclist.insert(abc);
ABC * abc_ptr = &(*abclist.begin());
Run Code Online (Sandbox Code Playgroud)
在其他的字将abc_ptr被指出abc在整个执行,如果我不删除abc的abc_list.
我问这个是因为我要用ABCC++/Cli ABC包装类,所以我需要指向包装类中的实例的指针.ABC是一个简单的类,我希望容器处理内存.如果答案是否定的话我将使用std::list<ABC*>.
我创建了ptr作为指向5个字符数组的指针.
char (*ptr)[5];
Run Code Online (Sandbox Code Playgroud)
为它指定了一个char数组的地址.
char arr[5] = {'a','b','c','d','e'};
ptr = &arr;
Run Code Online (Sandbox Code Playgroud)
使用指针ptr可以访问此数组中的char值吗?
printf("\nvalue:%c", *(ptr+0));
Run Code Online (Sandbox Code Playgroud)
它不打印该值.
在我的理解中,ptr将包含数组的基址,但它实际上指向完整数组所需的内存(即5个字符).因此,当ptr递增时,它会向前移动sizeof(char)*5字节.那么使用这个指向数组的指针是不是可以访问数组的值?
我有这个代码:
char* hello = "Hello World";
std::cout << "Pointer value = " << hello << std::endl;
std::cout << "Pointer address = " << &hello << std::endl;
Run Code Online (Sandbox Code Playgroud)
这是结果:
Pointer value = Hello World
Pointer address = 0012FF74
Run Code Online (Sandbox Code Playgroud)
当我使用OllyDbg调试我的程序时,我看到0x0012FF74的值是例如0x00412374.
有什么方法可以打印hello指向的实际地址吗?
我将指向结构的指针传递给函数时遇到了问题.我的代码基本上如下所示.在main函数中调用modify_item后,stuff == NULL.我想要东西是一个指向项目结构的指针,元素等于5.我做错了什么?
void modify_item(struct item *s){
struct item *retVal = malloc(sizeof(struct item));
retVal->element = 5;
s = retVal;
}
int main(){
struct item *stuff = NULL;
modify_item(stuff); //After this call, stuff == NULL, why?
}
Run Code Online (Sandbox Code Playgroud) 我有以下功能:
func addCatsToMap(m map[string][]CatHouse, meowId int, treats Set, dog *Dog) {
//if (complicated thing) add Cat to m
}
Run Code Online (Sandbox Code Playgroud)
其中Set,type的类型treats是具有以下定义的接口:
type Set interface {
Add(value string)
Contains(value string) (bool)
Length() (int)
RemoveDuplicates()
}
Run Code Online (Sandbox Code Playgroud)
题:
这是真的m,treats和dog是通过按引用,并且meowId有它的价值被复制?
我认为:
m 是传递参考,因为它是一张地图dog是一个结构.所以,我应该传递指针以避免复制数据假设在我的平台上sizeof(int)==sizeof(void*),我有这个代码:
printf( "%p", rand() );
Run Code Online (Sandbox Code Playgroud)
这是不确定的行为,因为传递一个不是有效指针的值代替%p?
作为我的第一门编程语言,我学习了Java,但是由于我改为另一所大学,我现在正在学习C++.
来自Java并学习C++的基础知识,我阅读了有关引用和引用变量的内容.它们有多危险,如何小心它们等等.
因此,在我脑海中出现了一个简单的问题:为什么我要使用那种复杂的,因此可能引起问题的东西呢?
它是不是值得,或者只是RAM大约64MB的时候的遗物?
由于很多答案都提到了指针:这个概念显然来自石器时代,imho.除了高性能计算,我甚至不会触及那些东西.
我试图使用dlopen()和dlsym()在我的代码,并编译它gcc.
这是第一个文件.
/* main.c */
#include <dlfcn.h>
int main()
{
void *handle = dlopen("./foo.so", RTLD_NOW);
if (handle) {
void (*func)() = dlsym(handle, "func");
func();
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这是第二个文件.
/* foo.c */
#include <stdio.h>
void func()
{
printf("hello, world\n");
}
Run Code Online (Sandbox Code Playgroud)
这是我编译和运行代码的方法.
$ gcc -std=c99 -pedantic -Wall -Wextra -shared -fPIC -o foo.so foo.c
$ gcc -std=c99 -pedantic -Wall -Wextra -ldl -o main main.c
main.c: In function ‘main’:
main.c:10:26: warning: ISO C forbids initialization between function …Run Code Online (Sandbox Code Playgroud) 我有一个在.h中定义的结构
struct buf_stats {
// ***
};
Run Code Online (Sandbox Code Playgroud)
然后在.c文件中
struct buf_stats *bs = malloc(sizeof(struct buf_states*)) ;
Run Code Online (Sandbox Code Playgroud)
哪里buf_states是拼写错误.
但gcc并没有警告我,虽然我用过 -Wall
这个错误/错字花了我3个小时才发现.
如何让gcc像这样警告未定义的结构?
int foo = 11;
int *p = &foo;
auto pp = p;
auto *ppp = p;
cout << pp << endl;
cout << ppp << endl;
Run Code Online (Sandbox Code Playgroud)
这个程序会为pp和产生相同的输出ppp,但为什么呢?auto推断变量应该是int,所以我认为声明ppp是对的.但是pp并且ppp具有相同的价值......
输出:
0x61fefc
0x61fefc
Run Code Online (Sandbox Code Playgroud)