c - 在 C 中,如何创建一个函数,给定一个字符串文字作为参数,返回一个 char*?(没有在堆上分配新内存)
问题描述
期望的结果:
utilityfun("&xxx")
必须返回指向“xxx”的指针。
utilityfun("xxx")
必须返回指向“*xxx”的指针。
#include <stdio.h>
#include <string.h>
char* utilityfun(char *s)
{
if(*s=='&')
return s+1; // this case works fine
else
{
char r[strlen(s)+2];
memset(r,'*',1);
strcpy(r+1,s);
char* p=r;
return p; // !!! p is local to this stack frame!
}
}
void main()
{
char* q=utilityfun("xxx");
printf("%p\n",q);
printf("%s\n",q); // *xxx It seems to work if I use q right way, but...
utilityfun("eee");
printf("%s\n",q); // *eee
}
在堆上分配一个新的字符数组是唯一的方法吗?
我的问题是:作为utilityfun
一个实用函数,我不想每次使用它时都必须释放它之外的内存。有办法吗?
解决方案
鉴于它只需要使用字符串文字……您可以使用宏。
#include <stdio.h>
#define utilityfun(x) utilityfun_("*" x)
char *utilityfun_(char *s) {
if (s[0] == '*' && s[1] == '&') {
return s + 2;
}
return s;
}
int main(int argc, char **argv) {
char *a = utilityfun("eee");
char *b = utilityfun("&fff");
// Prints "a = *eee; b = fff;\n"
printf("a = %s; b = %s;\n", a, b);
}
这是一个非常丑陋的 hack,但它不会在运行时分配内存。它只适用于字符串文字,因为它使用字符串文字连接来避免分配——在 C 中,"abc" "def"
变成"abcdef"
. 这不适用于非文字,例如,"abc" x
不起作用。
推荐阅读
- d3.js - d3.js not rendering geojson data correctly
- javascript - 如何在纯(香草)JavaScript 中修复我的可拖动代码,移动 div 的问题(div 跳跃或不移动)
- java - 如何使用 OpenJPA 持久化包含 Hstore 字段的实体
- python - 与 python 子进程相同的节点代码在另一个操作系统和硬件中不起作用
- azure - REST Api 使用访问密钥到 Azure Blob 存储
- c# - 为什么在尝试订阅事件时出现转换错误?
- javascript - Optimize multiple window.location.href = "index.html"
- c# - 尝试通过 JQuery Ajax 异步上传文件并将其保存在文件夹中时,DNN 模块中的方法返回空值
- python - 将自定义标签添加到 pytorch 数据加载器/数据集不适用于自定义数据集
- java - Linux播放视频命令几秒钟后冻结