小编Rof*_*er4的帖子

在C和C++中,是一个使用逗号运算符的表达式,如"a = b,++ a;" 未定义?

拿这三个C代码片段:

1) a = b + a++
2) a = b + a; a++
3) a = b + a, a++
Run Code Online (Sandbox Code Playgroud)

每个人都知道示例1是非常糟糕的事情,并且明确地调用未定义的行为.例2没有问题.我的问题是关于示例3.逗号运算符在这种表达式中是否像分号一样工作?2和3是等价还是3和1一样未定义?

具体来说,我正在考虑这个问题free(foo), foo = bar.这基本上与上述问题相同.我可以确定foo在重新分配之前被释放,或者这是一个明确的序列点问题吗?

我知道这两个例子都是毫无意义的,只使用分号并完成它就更有意义了.我只是出于好奇而问.

c c++ undefined-behavior

22
推荐指数
2
解决办法
2487
查看次数

是应该显式转换整数类型(例如`int` to`inigned``)还是只是添加杂乱?

这是一个非常小的问题,所以如果它太宽泛或可能重复,我表示道歉.我搜索并发现了几个关于隐式整数转换如何工作的问题,但没有人质疑它是否是一件好事.我根本不关心这一点,但是编译器给出隐含转换的所有响亮和恼人的警告让我想知道这是否被认为是一个问题.

举一个简单的例子,这里是一个片段调用一个函数,它接受一个链表,一个整数(索引)和一个无符号整数(范围),它从链表中删除指定的范围.

const int64_t first = foo;
const int64_t last  = bar;
const int     diff  = last - first; /* int for example's sake */
/* ... */
ll_delete_range_at(baz->ll, first+1, diff-1);
Run Code Online (Sandbox Code Playgroud)

死简单; 不是非常有趣.但clang抱怨传递给函数的值会缩短,在第二种情况下会改变符号.假设我知道(就像我在这里做的那样)不存在溢出问题,并且值总是正的,这实际上是一个问题吗?是否应该明确表示这样?

ll_delete_range_at(baz->ll, (int)(first+1), (unsigned)(diff-1));
Run Code Online (Sandbox Code Playgroud)

据我了解,除了添加杂乱并明确声明程序员知道正在完成转换并且确信它们没问题之外,这只会改变.这值得杂乱吗?

c c++

1
推荐指数
1
解决办法
126
查看次数

是否可以free()函数返回的指针?

过去这个问题很可能已被回答(很多次),但我通过搜索找不到任何这样的答案.无论如何,这是一个非常小的问题.

我创建了一个小函数(粗略地)执行非标准GCC函数strdup()的功能.你传递一个字符串,它检查大小,为新字符串分配足够的内存,并返回它(或NULL).但是,无论出于何种原因,我似乎无法在调用函数中释放该指针.我在运行时遇到seg错误或"无效指针"错误.

我怀疑这个问题只是因为我试图释放的指针与最初发送给malloc的指针不同,并且可以通过向函数传递一个双指针并且可以很容易地解决这个问题.它为它分配了新的字符串,并没有返回任何内容,但令我困惑的是,我可以成功地释放"官方"strdup()函数返回的指针而没有任何问题.是什么赋予了?

这是代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char *strdup2(char *buf);

int main()
{
     char *str1, *str2;

     str1 = strdup("This is the first test!");
     str2 = strdup2("This is the second test!");
     printf("%s\n%s\n", str1, str2);

     free(str1);
     puts("First pointer successfully freed.");
     free(str2);
     puts("Second pointer successfully freed.");
     return 0;
}

char *strdup2(char *buf)
{
     size_t len = strlen(buf)+1;
     char *str = malloc(len);
     if (str == NULL)
          return NULL;
     memcpy(str, buf, len);
     return buf;
}
Run Code Online (Sandbox Code Playgroud)

运行时,我得到:

This is the first test!
This …
Run Code Online (Sandbox Code Playgroud)

c string malloc pointers

-2
推荐指数
1
解决办法
844
查看次数

标签 统计

c ×3

c++ ×2

malloc ×1

pointers ×1

string ×1

undefined-behavior ×1