据我所知(或者我认为我理解),作为指针的变量只存储其值的内存地址.
让我们说:
int x = 5;
NSString *str1 = [NSString stringWithCString:"one"];
Run Code Online (Sandbox Code Playgroud)
那么x的值是5.这就是我在调试器中看到的,当我在那里放置断点时.
但:
str1的值不是"一".它是一个像bfffd3d0这样的内存地址.这就是我在调试器的"值"字段中看到的,当我停在那里时.因此,这个bfffd3d0内存地址背后是NSString对象,它具有巨大的数据结构(假设它很庞大),大量的实例变量,值等等.这几乎是对的吗?
我不是在谈论变量名本身的内存,而是关于变量"引用"或指向或存储的值或其他内容.
来自.NET背景我用来重用字符串变量进行存储,下面的代码是否可能导致内存泄漏?该代码针对iphone/itouch,因此没有自动GC.
-(NSString*) stringExample
{
NSString *result = @"example";
result = [result stringByAppendingString:@" test"]; // where does "example" go?
return result;
}
Run Code Online (Sandbox Code Playgroud)
令我困惑的是NSStrings是不可变的,但你可以重复使用'immutable'变量没有问题.
假设我有一个大小为78719476736字节的数组.请注意,在我的C代码中使用malloc动态分配此数组.假设malloc在分配了这么多内存后返回一个有效的指针.此数组的大小大于UINT_MAX(4294967295),即无符号整数的最大限制(32位)
假设我的代码看起来像下面的东西,例如
int *buf;
buf = (int*)malloc(78719476736);
Run Code Online (Sandbox Code Playgroud)
这里78719476736大于4*UINT_MAX.
现在如果我必须引用buf的所有元素,那么因为buf是int*它将是32位,所以它将无法处理我使用malloc(78719476736字节)分配的所有内存元素.
我的问题是不应该将上面的代码更改为使buf为long long(64位变量),因为只有long long变量才能解决我已经分配的大内存.
改变了代码,例如
unsigned long long int buf;
buf = (unsigned long long int*)malloc(78719476736);
Run Code Online (Sandbox Code Playgroud)
实际上我认为,变量buf不应该再是指针,因为任何指针都是32位宽,因此它将无法访问78719476736字节.
所以它应该是一个普通的unsigned long long int,并且我必须将malloc返回指针值转换为unsigned long long int,如上面更改的代码所示,并使用buf访问所有已分配的元素.
我在上面的假设中是否正确?
要么
我混淆/遗失了什么吗?
编辑:如果有帮助,
我正在使用Intel Core 2 Duo(64位CPU)上的WinXP桌面.因此,CPU智能访问超过4 GB的地址空间不应该是一个问题.应该为64位支持启用所有其他组件,即
a.)如何在编译时启用64位编译器支持(我使用的是Visual Studio 2005专业版)
b.)64位操作系统支持 - 我使用的是Windows XP Professional.
谢谢.
-广告.
我需要一个多维的字符数组,它只在一个维度上是动态的......
我必须存储一对字符串,每个字符串的长度为10(或更少)字符,但具有可变数量的"对".
我的想法是这样的
char (*instrucao)[2][10];
Run Code Online (Sandbox Code Playgroud)
这给了我一个指向2x10字符数组的指针,但当我做这样的事情时这不能正常工作:
char strInstrucoes[117], *conjunto = calloc(21, sizeof(char));
instrucao = calloc(1, sizeof(char[2][10]));
conjunto = strtok(strInstrucoes,"() ");
for(i = 0; conjunto != NULL; i++){
realloc(instrucao, i+1*sizeof(char[2][10]));
sscanf(conjunto,"%[^,],%s", instrucao[i][0], instrucao[i][1]);
printf("%s | %s\n", instrucao[i][0], instrucao[i][1]);
conjunto = strtok(NULL, "() ");
}
Run Code Online (Sandbox Code Playgroud)
有了strInstrucoesas (abc,123) (def,456) (ghi,789),我没有矩阵与3对2对,每个像这样:
abc | 123
def | 456
ghi | 789
Run Code Online (Sandbox Code Playgroud)
但这是我得到的:
abc | 123
def | 45def | 45de
ghi | 789
Run Code Online (Sandbox Code Playgroud)
这样做的正确方法是什么?谢谢!
我正在为一项任务建立一个比较器,我正在把我的头发拉出来,因为这似乎很简单,但我无法理解.
这个功能给我带来了麻烦:
int compare(Word *a, Word *b)
{
string *aTerm = a->getString();
string *bTerm = b->getString();
return aTerm->compare(bTerm);
}
Run Code Online (Sandbox Code Playgroud)
Word :: getString返回一个字符串*
错误:
In member function `virtual int CompWordByAlpha::compare(Word*, Word*)':
no matching function for call to...
Run Code Online (Sandbox Code Playgroud)
......后跟一堆函数定义.
有帮助吗?
所以我现在正在学习C++,而我正试图用指针来解决问题.任何人都可以解释以下情况:
bool testFalse = false; //testFalse = false
bool *thisIsFalse = &testFalse; //value of address of thisIsFalse shows that the address contains false
bool shouldBeFalse = &thisIsFalse; //shouldBeFalse = true is what I get here
Run Code Online (Sandbox Code Playgroud)
shouldBeFalse(顾名思义)应该是假的,但肯定不会那样.有人可以解释为什么它最终成为真实,如何使它成为正确的价值?谢谢!
var Buffer: TMemoryStream
Run Code Online (Sandbox Code Playgroud)
代码:
Move((PByte(Buffer.Memory)+Buffer.Position)^, Buffer.Memory^, Buffer.Size - Buffer.Position);
Run Code Online (Sandbox Code Playgroud)
遗憾的是,这是不可能的:运算符不适用于此类操作数.
那么我怎样才能获得MemoryBuffer的起点?
好的,我通过2层函数fun1调用func2调用func3.我使用基本上int*ptr一直向下传递一个指针,在调用堆栈的最低"级别"我还有另一个为int数组动态分配内存的函数.在顶层(func1级别),我总是为传递的指针返回null.我已经追溯到func3并且分配的内存正在填充值,但是当调用堆栈突然解除func3 - > func2时,指针就会消失(0x0000_0000)?我不明白在func3级别我基本上说ptr = allocate_ptr_array,但从那个返回它变为NULL!即使我没有释放记忆,世界上还在发生什么?我知道我的问题令人困惑.我已经在调试器中看到过这种情况
我不确定我对C++的理解是否错误.我已经读过1)所有非零值都等于TRUE,零等于FALSE; 2)空指针存储为零.
然而这样的代码:
void ViewCell::swapTiles (ViewCell *vc) {
ViewTile *tmp = vc->tile();
[stuff ...]
if (tmp) addTile(tmp);
}
Run Code Online (Sandbox Code Playgroud)
从解除引用空指针给我一个段错误,但是
if (tmp != 0) addTile(tmp);
Run Code Online (Sandbox Code Playgroud)
工作良好.知道为什么吗?
我知道指针的基础知识.
我想知道你什么时候使用
Foo *foo;
Run Code Online (Sandbox Code Playgroud)
代替
Foo foo;
Run Code Online (Sandbox Code Playgroud)
而另一个人则不允许你这样做.
提前致谢
pointers ×10
c++ ×4
c ×3
objective-c ×2
arrays ×1
buffer ×1
delphi ×1
long-integer ×1
nsstring ×1
string ×1