要再函数中改变外部指针的指向,必须将该指针的指针传入,如果只传入该指针,在函数中对指针指向修改并不会影响在外部该指针的值,和传入参数是局部变量道理相同。
#include <stdio.h>
#include <stdlib.h>
#include "adt_def.h"
Node *createStack()
{
Node *head = NULL;
return head;
}
void printStack(Node * const head)
{
Node *stack = head;
while (stack != NULL) {
printf("elem = %d\n", stack->data);
stack = stack->next;
}
}
void pushStack(Node **head, ElemType e)
{
Node *newNode = (Node *)malloc(sizeof(Node));
newNode->data = e;
newNode->next = *head;
*head = newNode;
}
int main(void)
{
Node *stack = createStack();
pushStack(&stack, 4);
pushStack(&stack, 99);
pushStack(&stack, 22);
printStack(stack);
return 0;
}
char strings[4][6] = {"hello", "Hello", "apple", "array"};
printf("sizeof strings: %d, sizeof strings[0]: %d\n", sizeof(strings), sizeof(strings[0])); // 4 * 6 = 24, 6
int arr[] = {1, 3, 6, 2, 3, 15, 4};
printf("sizeof arr: %d\n", sizeof(arr)); // 7 * 4 = 28
inline void foo() //正确
{
...
}
inline void foo(); //不正确
void foo()
{
...
}
-std=c99
和-O2
参数才能使内联函数生效。
$ gcc -std=c99 -S -O2 inlinetest.c
#include <stdio.h>
int foo()
{
printf("external foo function\n");
}
$ gcc inlinetest.c externfoo.c
/tmp/ccjb5QWS.o: In function `foo':
externfoo.c:(.text+0x0): multiple definition of `foo'
/tmp/cclrNVro.o:inlinetest.c:(.text+0x0): first defined here
collect2: error: ld returned 1 exit status
$ gcc -std=c99 inlinetest.c externfoo.c
$ cat foo.c
#include <stdio.h>
inline void foo();
inline void foo()
{
printf("inline foo function in foo.c\n");
}
$ cat callfoo.c
int main()
{
foo();
}
$ gcc -std=c99 callfoo.c foo.c
/tmp/ccxnFA3n.o: In function `main':
callfoo.c:(.text
malloc从内存池中提取一块合适的内存,并向该程序返回一个指向这块内存的指针。这块内存此时并没有以任何方式进行初始化。
void *malloc( size_t size );
malloc的参数是需要分配的字节数,分配的是一块连续的内存。
对malloc返回的指针进行检查,确保它是非NULL。
void free( void *pointer );
free的参数是之前从malloc、calloc或realloc返回的值,也可以是NULL(但没有任何效果)。
void *calloc( size_t num_elements, size_t element_size );
malloc
C语言最初是由丹尼斯.里奇在贝尔实验室为开发UNIX操作系统而设计的。C语言是以B语言为基础的。
提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。
以一个标准规格写出的C语言程序可在许多电脑平台上编译,甚至包含一些嵌入式处理器以及超级电脑等作业平台。
ANSI C是由美国国家标准协会(ANSI)及国际标准化组织(ISO)推出的关于C语言的标准,用于避免各开发厂商用的C语言语法产生差异。
C语言常用于操作系统开发、嵌入式开发、数据库管理系统、语言编译器等。
不同计算机使用不同的机器语言方案,C编译器负责把C代码翻译成特定的机器语言。此外,C编译器还将源代码与C库的代码合并成最终的程序(更准确地说是链接器,但大多数系统中编译器运行链接器)。编译器还会检查C语言程序是否有效,如果C编译器发现错误就不生成可执行文件并报错。
编译器把源代码转换成中间代码,链接器把中间代码和其他代码合并,生成可执行文件。一般C编译器把源代码转换为机器语言代码,并把结果放在目标代码文件中,虽然目标代码中包含机器语言代码,但是并不能直接运行该文件,因为目标文件中储存的是编译器翻译的源代码,并不是完整的程序。目