小编alk*_*alk的帖子

如何打印功能的地址?

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行中的代码.

在打印功能的地址时删除警告我错过了什么?

c linux gcc function-pointers gcc-warning

16
推荐指数
3
解决办法
1万
查看次数

将指向本地变量的指针传递给函数:它安全吗?

例如:

void func1(){
    int i = 123;
    func2(&i);
}
void func2(int *a){
    *a = 456;
}
Run Code Online (Sandbox Code Playgroud)

func1调用func2,一个指向局部变量传递到func2-指针指向堆栈.这对C的规则是否安全?

谢谢.

c stack pointers

16
推荐指数
2
解决办法
1万
查看次数

稳定标准库qsort?

我假设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)

c qsort stable-sort

15
推荐指数
2
解决办法
5734
查看次数

减少指针超出范围; 将它增加到边界

以下是否会在第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)

c pointers undefined-behavior

15
推荐指数
3
解决办法
1213
查看次数

我在哪里获得arpa/inet.h?

问题很简单.我需要一个工具转换char*为ip地址并使用它

sockaddr_in.s_addr
Run Code Online (Sandbox Code Playgroud)

arpa/inet.h有inet_addr()功能,但我不确定我是否已在MS VS 2010安装中的某个地方使用此文件,或者我应该在别处获取它.

c c++ sockets visual-studio

15
推荐指数
2
解决办法
4万
查看次数

释放后重新分配指针变量

这合法吗?ptr它可以在被释放后分配给它吗?

int * ptr = (int*) malloc(sizeof(int));
free(ptr);
ptr = (int *) malloc(sizeof(int));
Run Code Online (Sandbox Code Playgroud)

c free pointers dynamic-memory-allocation

15
推荐指数
5
解决办法
2881
查看次数

如何减小生成的二进制文件的大小?

我知道有一个选项"-Os"来"优化尺寸",但它几乎没有影响,甚至在某些场合增加尺寸:(

strip(或"-s"选项)删除调试符号表,工作正常; 但它只能减少尺寸的小比例.

还有其他方法可以继续吗?

linux gcc strip compiler-optimization

14
推荐指数
5
解决办法
1万
查看次数

Errno:11,资源暂时不可用

我正在使用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)

c sockets udp

14
推荐指数
1
解决办法
7万
查看次数

以任何方式指定配置文件数据的位置

运行可执行文件的默认配置文件,并调用该文件gmon.out.有没有办法指定新的位置?

我在i386/linux2.6上使用gcc 3.4.6

linux gcc gprof

13
推荐指数
2
解决办法
3803
查看次数

如何通过调用exec系列函数来获取程序的返回值?

我知道可以通过管道读取命令输出吗?但是获得回报价值呢?例如,我想执行:

execl("/bin/ping", "/bin/ping" , "-c", "1", "-t", "1", ip_addr, NULL);
Run Code Online (Sandbox Code Playgroud)

如何获取ping命令的返回值以查明它是返回0还是1?

c exec

13
推荐指数
2
解决办法
3万
查看次数