我gcc使用以下方法编译以下示例-Wall -pedantic:
#include <stdio.h>
int main(void)
{
printf("main: %p\n", main); /* line 5 */
printf("main: %p\n", (void*) main); /* line 6 */
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我明白了:
main.c:5: warning: format ‘%p’ expects type ‘void *’, but argument 2 has type ‘int (*)()’
main.c:6: warning: ISO C forbids conversion of function pointer to object pointer type
Run Code Online (Sandbox Code Playgroud)
第5行让我更改了第6行中的代码.
在打印功能的地址时删除警告我错过了什么?
例如:
void func1(){
int i = 123;
func2(&i);
}
void func2(int *a){
*a = 456;
}
Run Code Online (Sandbox Code Playgroud)
当func1调用func2,一个指向局部变量传递到func2-指针指向堆栈.这对C的规则是否安全?
谢谢.
我假设stdlib中的旧的qsort函数不稳定,因为手册页没有说明任何内容.这是我正在谈论的功能:
#include <stdlib.h>
void qsort(void *base, size_t nmemb, size_t size,
int(*compar)(const void *, const void *));
Run Code Online (Sandbox Code Playgroud)
我假设如果我改变我的比较函数也包括我正在比较的地址,它将是稳定的.那是对的吗?
例如:
int compareFoos( const void* pA, const void *pB ) {
Foo *pFooA = (Foo*) pA;
Foo *pFooB = (Foo*) pB;
if( pFooA->id < pFooB->id ) {
return -1;
} else if( pFooA->id > pFooB->id ) {
return 1;
} else if( pA < pB ) {
return -1;
} else if( pB > pA ) {
return 1;
} else {
return …Run Code Online (Sandbox Code Playgroud) 以下是否会在第4行和/或第5行中引发未定义的行为:
#include <stdio.h>
int main(void)
{
char s[] = "foo";
char * p = s - 1; /* line 4 */
printf("%s\n", p + 1); /* line 5 */
return 0;
}
Run Code Online (Sandbox Code Playgroud) 问题很简单.我需要一个工具转换char*为ip地址并使用它
sockaddr_in.s_addr
Run Code Online (Sandbox Code Playgroud)
arpa/inet.h有inet_addr()功能,但我不确定我是否已在MS VS 2010安装中的某个地方使用此文件,或者我应该在别处获取它.
这合法吗?ptr它可以在被释放后分配给它吗?
int * ptr = (int*) malloc(sizeof(int));
free(ptr);
ptr = (int *) malloc(sizeof(int));
Run Code Online (Sandbox Code Playgroud) 我知道有一个选项"-Os"来"优化尺寸",但它几乎没有影响,甚至在某些场合增加尺寸:(
strip(或"-s"选项)删除调试符号表,工作正常; 但它只能减少尺寸的小比例.
还有其他方法可以继续吗?
我正在使用c套接字来实现可靠的UDP协议.我正在使用以下代码在我正在等待确认的套接字上设置超时.我不知道为什么我得到错误11,资源暂时不可用.
//set timer for recv_socket
struct timeval tv;
tv.tv_usec = TIMEOUT_MS;
if(setsockopt(rcv_sock, SOL_SOCKET, SO_RCVTIMEO,&tv,sizeof(tv)) < 0){
printf("Error setting the socket timeout.\n");
}
int recv_msg_len;
if(recv_msg_len = recvfrom(rcv_sock, ackBuffer,sizeof(ackBuffer), 0,
(struct sockaddr *) &servAddr2, &fromSize) < 0){
//timeout reached
printf("Error Reporting: %d : %s\n", errno, strerror(errno));
num_timeouts++;
}
Run Code Online (Sandbox Code Playgroud)
我也尝试过评论中提到的select方法.我在循环中有以下代码,但recvfrom永远不会超时.
fd_set set;
FD_ZERO(&set); /* empties the set */
FD_CLR(rcv_sock,&set); /* removes FD from the set */
FD_SET(rcv_sock,&set); /* adds FD to the set */
if(select(rcv_sock + 1, &set, NULL, NULL, &tv) < …Run Code Online (Sandbox Code Playgroud) 运行可执行文件的默认配置文件,并调用该文件gmon.out.有没有办法指定新的位置?
我在i386/linux2.6上使用gcc 3.4.6
我知道可以通过管道读取命令输出吗?但是获得回报价值呢?例如,我想执行:
execl("/bin/ping", "/bin/ping" , "-c", "1", "-t", "1", ip_addr, NULL);
Run Code Online (Sandbox Code Playgroud)
如何获取ping命令的返回值以查明它是返回0还是1?