首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >这个C代码是一个定义的行为吗?

这个C代码是一个定义的行为吗?
EN

Stack Overflow用户
提问于 2015-07-16 23:30:17
回答 2查看 114关注 0票数 11

这是一个思想实验,不是制作代码,也不是好的编码风格。

假设我们有这个函数

代码语言:javascript
复制
int find_process_pid_by_name(char* name, int* threads_in_process);

它返回命名进程的PID,并始终将运行在该进程中的线程数存储到threads_in_process中。

一个懒散的程序员,只对PID感兴趣,写这段代码

代码语言:javascript
复制
int pid = find_process_pid_by_name("a process name", &pid);

它会触发未定义的行为吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-07-16 23:40:08

不-我不认为这是不明确的行为。在调用函数之前有一个序列点(在对参数和表示被调用函数的表达式进行了计算之后),在被调用函数返回之前还有一个序列点。被调用函数对pid执行的任何副作用都已在函数完成返回之前完成。然后将函数的结果分配给pid。不存在由函数指定要更改的位置的问题。我看不出有什么能引起未定义的行为。

我假设被调用的函数将int *参数视为指向单个值的只写指针。如果它从单个值读取,我们需要知道pid以前已经初始化过(形式上;在实践中,这并不重要)。在上下文中,pid尚未初始化;函数的结果将初始化它。因此,如果函数从指针参数读取,技术上来说,您有未定义的行为。如果函数将指针视为多元素数组的开始,并访问超出第零元素的值,则会出现问题。但这些问题在某种程度上超出了问题/讨论的预期范围。

票数 10
EN

Stack Overflow用户

发布于 2015-07-16 23:41:01

是的,我相信这个代码定义得很清楚。在将返回值复制到调用上下文之前,函数的末尾有一个序列点。因此,函数将首先通过pid间接地通过threads_in_process分配给pid,然后返回,然后将返回值赋值给pid

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31466226

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档