我正在使用Swift编译器的Bridging Headerfunction来调用使用malloc()分配内存的C函数。 然后它返回一个指向该内存的指针。 函数原型是这样的: char *the_function(const char *); 在Swift中,我使用它: var ret = the_function((“something” as NSString).UTF8String) let val = String.fromCString(ret)! 原谅我对Swift的无知,但通常在C中,如果the_function()是malloc的内存并返回它,其他人需要在某个时候释放()它。 这是由Swift以某种方式处理还是我在这个例子中泄漏内存? 提前致谢。
指针在C中是一个非常棘手的事情。因为很多人很难理解它,所以为了更好地理解我写了下面的代码: #include #include int main(int argc, char *argv[]) { int *p; // pointer -> will be dynamic allocated int *a; // array -> will be dynamic allocated // print before allocate memory (1) printf(“&p: %p\tp: %p\t*p: %d\n”, &p, p, *p); printf(“&a: %p\ta: %p\t*a: %d\n”, &a, a, *a); printf(“\n”); // allocate memory (2) p = (int […]
为什么这段代码会给我一个警告:从不兼容的指针类型传递“test”的参数1? 我知道这是关于char之前的const,但为什么呢? void test(const int ** a) { } int main() { int a=0; int *b=&a; int **c=&b; test(c); return 0; }
考虑以下2个程序prog1和prog2。如果我尝试使用指针ptr更改const限定变量i的值,我得到警告(而不是错误) “initialization discards qualifiers from pointer target type|” ,但程序运行然后显示新值。但是如果我尝试使用赋值语句在第二个程序中更改i的值,我得到assignment of read-only variable ‘i’|的错误 (不是警告) assignment of read-only variable ‘i’| 。 以下是此前提产生的混淆: 1)为什么我们允许在任何情况下更改只读const限定变量的值?它是否会破坏使用const限定符的目的?如果我们尝试这样做,我们不应该得到错误吗? 2)即使由于一些奇怪的原因我们被允许更改常量值,为什么在使用指针(允许,带警告)和使用赋值更改只读const限定变量的值之间进行区分操作(根本不允许,并给我们一个错误)? //prog1 #include int main () { const int i=8; int *ptr=&i; *ptr=9; printf(“%d”,*ptr); //Prints new value nevertheless } 警告:初始化从指针目标类型中丢弃限定符 //prog2 #include int main() { const int i=8; i=10; printf(“%d”,i); } 错误:分配只读变量’i’| 编辑H2CO3 […]
我想比较两个这样的void指针: void foo(void* p1, void* p2) { if (p1 < p2) { void *tmp = p1; p1 = p2; p2 = tmp; } // do something with p1 and p2. } 根据标准,这是正确的吗? 我的意思是void指针的比较是一个明确定义的行为? 如果有人能指出我记录的C标准,我将不胜感激。
是否可以在内存中为变量分配所需的地址? 我试图这样做,但我得到一个错误,因为“Lvalue需要作为左操作数的赋值”。 int main() { int i = 10; &i = 7200; printf(“i=%d address=%u”, i, &i); } 我的方法出了什么问题? 在C中有什么方法可以将我们想要的地址分配给变量吗?
我知道数组名称可以用作指针(虽然它是转换后的forms),但我的问题是,是否有一些其他实例,其中数组充当指针。
我有一个chars table [] [] []的3D数组,我想将它传递给void函数,以便它可以对它进行更改。 我怎样才能做到这一点? void make(char minor[][][]); ….. char greater[20][30][50]; make(greater); 我猜这不会奏效。 编辑:与此相关的另一个问题:假设我想创建一个复制函数将字符串复制到数组中 – 我应该如何调用函数中的strcpy? void copy(char (*minor)[][]) { char m[50] = “asdasdasd”; strcpy(minor[][],m); }
注意:这个问题是关于星号( * )的位置。 在大多数C代码中,我看到(例如,在Beej的网络编程指南中 ),所有变量声明/定义都使用T *name格式,即将*绑定到变量名称。 指针被认为属于变量,而不是类型。 在我看到的大多数C ++代码中,格式是T* name ,即它将*绑定到变量的类型。 指针被认为属于类型,而不是变量。 我自己,作为一个纯粹的C ++编码器,也使用这种格式,因为指针类型清楚(对我来说)属于类型,而不是变量。 (很明显,即使是C ++标准也在示例中使用了这种格式。:)) 这有(历史性的)原因吗? 当程序员开始做C ++时,思维方式是否有所改变? 如果一个C编码器(使用前一种格式)可以解释他/她使用它的原因,而不是后者,那也很好。
我知道我的问题非常简单,但谷歌他们并没有给我任何有用的结果……他们可能太简单了!! 第1名 char* createStr(){ char* str1 = malloc(10 * sizeof(char)); printf(“str1 address in memory : %p\n”, &str1); return str1; } int main(void){ char* str2 = createStr(); printf(“str2 address in memory : %p\n”, &str2); } 结果: str1 address in memory : 0x7fffed611fc8 str2 address in memory : 0x7fffed611fe8 为什么地址不同于createStr()函数以及如何释放(str1)? 第2号 int main(int argc, int *argv[]){ printf(“Basename […]