为什么此代码会导致分段错误?

use*_*777 -1 c segmentation-fault

我正在编写一个返回字符串的first n(n <= strlen(src))字符的函数.

char* substring(char *src, int n)
{
   char *substr;
   int i;
   for (i = 0; i < n; i++)
     *substr++ = *src++;
   src = src - n;
   *substr = '\0';
   return substr - n;
}
Run Code Online (Sandbox Code Playgroud)

此函数仅在调用一次时返回正确的答案,但在多次调用时返回Seg Fault.

hmj*_*mjd 5

没有分配内存substr,因此函数会对未初始化的指针进行处理,并且正在写入不应该导致未定义行为的内存.它第一次工作的事实是完全的机会.

substr以下内容分配内存:

char* substr = malloc(n + 1); /* Plus one for null teminator. */
Run Code Online (Sandbox Code Playgroud)

请注意,调用者substring()必须free()返回缓冲区.