Tag: 指针

声明int的数组

这两个声明有什么区别? int x[10]; 与 int* x = new int[10]; 我想前面的声明(就像后面的声明)是一个指针声明,两个variables都可以被视为相同的。 这是否意味着它们本质上是一样的?

返回一个char *和一个char 函数的区别是什么?

为什么第一个函数返回string“Hello,World”,但是第二个函数什么也不返回。 我认为这两个函数的返回值是不确定的,因为它们返回超出范围的数据。 #include <stdio.h> // This successfully returns "Hello, World" char* function1() { char* string = "Hello, World!"; return string; } // This returns nothing char* function2() { char string[] = "Hello, World!"; return string; } int main() { char* foo1 = function1(); printf("%s\n", foo1); // Prints "Hello, World" printf("————\n"); char* foo2 = function2(); // […]

Cstring中'\ 0'之后的内存会发生什么?

令人惊讶的简单/愚蠢/基本的问题,但我不知道:假设我想返回我的函数的用户一个Cstring,其长度我不知道在函数的开始。 我可以在一开始只放置长度的上限,并且根据处理,尺寸可能缩小。 问题是,分配足够的堆空间(上限)是否有问题,然后在处理过程中终止string? (a。) free()仍然正常工作,(b。)在'\ 0'之后的空格变得无关紧要了吗? 一旦添加了“\ 0”,内存是否返回,还是坐在那里占用空间,直到free()被调用? 为了节省一些前期编程时间,在调用malloc之前计算必要的空间,通常是不好的编程风格吗? 为了给这个上下文,我们假设我想删除连续的重复,像这样: input“Hello oOOOo !!” – >输出“Helo oOo!” …以及下面的一些代码展示了我如何预先计算我的操作所产生的大小,有效地执行两次处理来获得堆大小的权利。 char* RemoveChains(const char* str) { if (str == NULL) { return NULL; } if (strlen(str) == 0) { char* outstr = (char*)malloc(1); *outstr = '\0'; return outstr; } const char* original = str; // for reuse char prev […]

C vs C ++结构alignment

在最近的一次关于C ++结构体字段alignment的问题上,我被问到了这个问题,并且理论上C和C ++在结构打包中遵循相同的策略。 Hovewer,这是错误的假设。 面试官说,总的来说,C和C ++以不同的方式打包,我们不应该期待相反的结果。 恕我直言,这是奇怪的声明。 C ++中没有用于双C / C ++头文件的pack "C"限定符。 所以实际上,这可能意味着你不能在C ++中创build一个结构体,并把它传递给一个C库,因为通常它的字段将以不同的方式alignment,并且具有不同的偏移量。 但事实上,大多数程序员认真地依赖于这种互操作性,直到他们将一个指针转换为一个C POD结构为止,以及一些辅助方法引用C ++包装。 你能澄清这个问题吗?

Go有什么指针?

我知道Go中的指针允许函数参数的变异,但是如果它们只采用引用(使用适当的const或可修饰的修饰符)就不会更简单。 现在我们有指针和一些内置的types,比如地图和通道隐式通过引用。 我是否错过了某些东西,或者在Go中只是一个不必要的并发症?

在不同的function分配的空闲内存?

我试图学习C和我目前正在尝试编写一个基本的堆栈数据结构,但我似乎无法获得基本的malloc / free权利。 这里是我一直在使用的代码(我只是在这里发表一小部分来说明一个特定的问题,而不是总代码,但是错误信息是通过在valgrind运行这个示例代码来生成的) #include <stdio.h> #include <stdlib.h> typedef struct Entry { struct Entry *previous; int value; } Entry; void destroyEntry(Entry entry); int main(int argc, char *argv[]) { Entry* apple; apple = malloc(sizeof(Entry)); destroyEntry(*(apple)); return 0; } void destroyEntry(Entry entry) { Entry *entry_ptr = &entry; free(entry_ptr); return; } 当我通过valgrind运行–leak-check=full –track-origins=yes ,出现以下错误: ==20674== Invalid free() / […]

指针是否考虑了在C中通过引用调用的方法?

在我的大学的C语言程序devise课上,她所写的教授和随后的书在引用C中的指针时使用了call或pass by reference这个术语。 我的教授认为是“引用函数”的一个例子: int sum(int *a, int *b); 我的教授认为是“价值函数”的一个例子: int sum(int a, int b); 我读过 C不支持通过引用调用。 就我的理解而言, 指针传递的是价值 。 基本上,说指针是C通过引用传递的方式是不正确的 ? 如果你不能通过C语言的引用传递,但是可以使用指针作为替代方法,会更准确吗? 更新11/11/15 从我提出的问题的方式来看,我认为有关术语的辩论已经出现,实际上我看到了两个具体的区别。 传递引用(当前主要使用的术语):在C ++等语言中使用的特定术语 通过引用(我的教授用作解释指针的范式的术语):在C ++之类的语言之前使用的通用术语被开发出来,因此在术语被重写之前 在阅读@Haris更新后的答案之后,为什么这不是那么黑白。

C#参考和指针有什么区别?

对不起,这样一个新手问题,但有一些我不太明白C#引用和指针之间的区别。 他们都指向一个记忆中的地方吗? 唯一的区别是我可以弄清楚的是,指针不是那么聪明,不能指向堆上的任何东西,免于垃圾回收,只能引用结构体或基types。 我所要问的一个原因是,有一种看法认为,人们需要了解指针(从CI猜测),并成为一名优秀的程序员。 很多学习高级语言的人都会错过这个机会,所以有这个弱点。 我只是没有得到什么如此复杂的指针? 这基本上只是一个参考,在内存中的一个地方是不是? 它可以返回它的位置,并直接与该位置的对象进行交互? 我错过了一个重要的观点吗?

我可以调用“字节数”设置为零的memcpy()和memmove()吗?

当我实际上没有任何东西移动/复制memmove() / memcpy()作为边缘情况下,我需要处理案件吗? int numberOfBytes = … if( numberOfBytes != 0 ) { memmove( dest, source, numberOfBytes ); } 或者我应该只是调用函数而不检查 int numberOfBytes = … memmove( dest, source, numberOfBytes ); 前面的代码段中的检查是否必要?

C#将函数存储在Dictionary中

如何创build一个可以存储函数的字典? 谢谢。 我有大约30多个可以从用户执行的function。 我想能够这样执行function: private void functionName(arg1, arg2, arg3) { // code } dictionaryName.add("doSomething", functionName); private void interceptCommand(string command) { foreach ( var cmd in dictionaryName ) { if ( cmd.Key.Equals(command) ) { cmd.Value.Invoke(); } } } 然而,函数签名并不总是相同的,因此具有不同数量的参数。