C中的动态和静态变量
变量声明可以在所有函数之外或在函数内部 所有函数外部的声明都是全局的并且在固定的内存位置静态声明将函数外部的变量声明为“文件全局”(不能被其他源文件中的代码引用) 声明在块语句内{}(函数体或嵌套在函数体内的块语句):动态分配,除非声明为静态当程序执行进入块时分配内存当执行退出块时释放内存如果函数调用自身(直接或间接地),它得到一组新的动态变量(称为堆栈帧)这与对函数的任何其他调用没有区别
您有问题,该变量result[]
是已在函数内部分配的变量-其生命周期延伸到函数的整个运行(在堆栈中分配!)因为您需要创建result
动态变量
修复代码:
#include <stdio.h>
#include <string.h>
char* substr(char *source, int start, int length)
{
char* result;
char *r;
result=(char*)malloc(sizeof(char)*10);
r = result;
strncpy(result, source+start, length);
printf("substr: %s\n", r);
return r;
}
int main()
{
char* r=substr("HELLO", 1, 2);
printf("main: %s\n",r );
free(r)//Don't forget to free it!
}
或者你可以result[]
像这样制作全局变量:
#include <stdio.h>
#include <string.h>
char result[10];//<======Global
char* substr(char *source, int start, int length)
{
char *r=result;
r = result;
strncpy(result, source+start, length);
printf("substr: %s\n", r);
return r;
}
int main()
{
printf("main: %s\n",substr("HELLO", 1, 2));
}