如何区分malloced字符串和字符串文字?

ssd*_*ssd 8 c string malloc char

有没有办法(在纯C中)区分malloced字符串和字符串文字,而不知道哪个是哪个?严格地说,我正试图找到一种方法来检查变量是否是一个malloced字符串,如果是,我会释放它; 如果没有,我会放手.

当然,我可以向后挖掘代码并确保变量是否被malloc编辑,但以防万一存在简单方法...

编辑:添加行以使问题更具体.

char *s1 = "1234567890"; // string literal
char *s2 = strdup("1234567890"); // malloced string
char *s3;
...
if (someVar > someVal) {
    s3 = s1;
} else {
    s3 = s2;
}
// ...
// after many, many lines of code an algorithmic branches...
// now I lost track of s3: is it assigned to s1 or s2?
// if it was assigned to s2, it needs to be freed;
// if not, freeing a string literal will pop an error
Run Code Online (Sandbox Code Playgroud)

Ed *_* S. 8

有没有办法(在纯C中)区分malloced字符串和字符串文字,

没有任何便携方式,没有.不用担心; 有更好的选择.

当你用C编写代码时,你会这样做,同时对"谁"拥有内存做出强有力的保证.来电者是否拥有它?那么他们有责任解除分配.被叫方拥有它吗?类似的事情.

你编写的代码非常清楚监管链和所有权链,你不会遇到诸如"谁解除分配这个问题?"之类的问题.你不应该觉得有必要说:

// after many, many lines of code an algorithmic branches...
// now I forgot about s3: was it assigned to s1 or s2?
Run Code Online (Sandbox Code Playgroud)

解决方案是; 别忘了!您可以控制代码,只需查看页面.设计它是防止泄漏内存到其他功能,而没有清楚地理解"嘿,你可以阅读这个东西,但不能保证它在X或Y之后有效.它不是你的记忆,如此对待它".

或许这是你的记忆.一个很好的例子; 你的电话strdup. strdup让你知道(通过文档)你有责任解除它返回给你的字符串.你如何做到这一点取决于你,但最好的办法是尽可能缩小范围,并尽可能短时间保持它.

这需要时间和实践才能成为第二天性.您将创建一些在您擅长之前处理内存不佳的项目.没关系; 你一开始的错误会告诉你究竟什么不该做,你将来会避免重复它们(希望如此!)

另外,正如@Lasse在评论中提到的那样,你不必担心s3,这是一个指针的副本,而不是整个内存块.如果你打电话给免费s2,s3你最终会得到未定义的行为.

  • @ merkez3110:你的问题不是你所描述的问题.真正的问题是你已经违反了我所说的规则.当您以这样的方式设计代码时,您可能已经丢失了.您创建了一个难以维护和推理的系统.解决方案; 不要那样做.*"现在,如果我需要在func中释放s3."foo` ......"* - 不,你没有!你已经阴沉了谁对那段记忆负责.如果`foo`可以接受任何字符串*那么它不应该负责解除分配*. (3认同)
  • ...`foo`的调用者负责,因为只知道正确的事情.您错误地将责任/所有权推送到无法推断其输入的函数.*那就是问题所在.这是一个设计问题,而不是技术问题.看看标准库函数; 你看到多少函数采用`char*`和*也*取消分配它? (2认同)