相关疑难解决方法(0)

如何区分堆或文字中的字符串?

我有一个用例,我可以获得在内存或文字中分配的字符串指针.现在后者不能被释放,所以如果我通过错误的话就会出问题.有没有办法知道哪一个被分配哪个不分配?

char *b = "dont free me!";
if(!IS_LITERAL(b)) {
    free(b);
}
Run Code Online (Sandbox Code Playgroud)

我想象那样的事情.

我的例子:

场景1:字面意思

char *b = "dont free me!";
scruct elem* my_element = mylib_create_element(b);
// do smth
int result = mylib_destroy_element(my_element); // free literal, very bad
Run Code Online (Sandbox Code Playgroud)

场景2:在堆中

char *b = malloc(sizeof(char)*17); // example
strncpy(b, "you can free me!",17);

scruct elem* my_element = mylib_create_element(b);
// do smth
int result = mylib_destroy_element(my_element); // free heap, nice
Run Code Online (Sandbox Code Playgroud)

用户如何调用mylib_create_element(b);不受我的控制.如果他在mylib_destroy_element崩溃之前释放.所以它必须mylib_destroy_element清理干净.

c

28
推荐指数
5
解决办法
1840
查看次数

字符串文字与C中的const char*

为什么ANSI C编译器不会在函数调用中标记字符串文字参数的使用,其中相关参数没有const限定符?例如,以下代码可以通过尝试写入只读内存来生成异常.

void somefunc(char buffer[10]);

void somefunc(char buffer[10]) {
    int i;

    for (i = 0;   i < 10;   i++)
       buffer[i] = 0;
}

int main(int argc, char **argv) {

    somefunc("Literal");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这种情况可以在编译时识别,但VS2010和gcc似乎没有这样做.使用const char*参数调用somefunc将生成编译器警告.

c

10
推荐指数
4
解决办法
2445
查看次数

标签 统计

c ×2