标签: c

指向[-1]数组索引的指针

指针如何指向[-1]数组的索引每次都会产生合法的输出.指针赋值实际发生了什么?

#include<stdio.h>
int main()
{
        int realarray[10];
        int *array = &realarray[-1];

        printf("%p\n", (void *)array);
        return 0;
}
Run Code Online (Sandbox Code Playgroud)

代码输出:

manav@workstation:~/knr$ gcc -Wall -pedantic ptr.c
manav@workstation:~/knr$ ./a.out
0xbf841140
Run Code Online (Sandbox Code Playgroud)

编辑:如果这种情况有效,那么我可以用它来定义一个索引从1开始而不是0的数组,即:array [1],array [2],...

c c++ arrays pointers

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

在UDP中接收错误:连接被拒绝

我试图在特定端口通过UDP向服务器发送字符串HI,然后接收响应.但是,在我尝试使用recvfrom()获取响应后,我陷入阻塞状态.我尝试使用连接的UDP,但我得到:

在UDP中接收错误:连接被拒绝

可能是什么原因?服务器不在我的控制之下,但我知道它工作正常.

我添加了代码

int sockfdudp;
char bufudp[MAXDATASIZE], port[6];
struct addrinfo hints, *servinfo, *p;
struct sockaddr_storage addr;   
int rv;
char s[INET6_ADDRSTRLEN];
int bytes_recv, bytes_sent;
socklen_t len;

scanf("%s",port);
printf("UDP Port: %s \n", port);

// Start connecting to datagram server  
memset(&hints, 0, sizeof hints);
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_DGRAM;

if ((rv = getaddrinfo(SERVER_NAME, port, &hints, &servinfo)) != 0) {
    fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(rv));
    return 1;
}

// loop through all the results and make a socket
for(p = servinfo; p != …
Run Code Online (Sandbox Code Playgroud)

c sockets udp udpclient

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

在C或其他编译器语言之前学习Python是一个好主意吗?

现在我正在通过麻省理工学院的OpenCourseWare计算机科学课程的介绍.作为本课程的一部分,我正在学习Python语言.

我已经阅读了很多关于学习C的好处的事情.在我深入研究Python之前,我想知道我是否会因为首先学习Python而受到阻碍或帮助.

你认为我会从Python中养成任何坏习惯或类似的东西吗?

编辑:由于问题的主观性质,已更改为社区Wiki.

我很感谢第一个问题的所有重要答案.我真的被答案/评论的诚意所震撼.谢谢,很多人!

c python swig python-sip

12
推荐指数
4
解决办法
3万
查看次数

具有lld,ld和d类型标识符的size_t变量的printf

我写了这个小代码:

#include <stdio.h>
int main() {
    size_t temp;
    temp = 100;

    printf("lld=%lld, ld=%ld, u=%u\n", temp, temp, temp);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我在带有gcc版本4.1.1 20070105(Red Hat 4.1.1-52)i386 GNU/Linux机器上运行它.这是我得到的输出:

lld=429496729700, ld=100, u=7993461
Run Code Online (Sandbox Code Playgroud)

我可以理解第一个(lld)被打印为垃圾,因为当变量中只有4个字节可用时,printf尝试打印8个字节(用于signed long long表示lld)temp.但是,我无法理解为什么最后一个标识符u被打印为垃圾 - 而在我的理解中,这是最接近的适用标识符size_t.

这里我假设size_tunsigned int(我的i386签名为4个字节).

现在,我对该printf线进行了一些调整:

...
printf("ld=%ld, u=%u, lld=%lld\n", temp, temp, temp);
...
Run Code Online (Sandbox Code Playgroud)

我有一个非常好的答案(lld部分除外).

ld=100, u=100, lld=34331653576851556
Run Code Online (Sandbox Code Playgroud)

有人可以帮我理解我在这里错过了什么吗?

非常感谢您的帮助!

[旁注:我尝试使用gcc -O[0,2]标签开/关切换优化,但观察结果没有任何差异.]

c printf

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

我如何实际使用授权服务?

我一直在寻找和试验近四个小时,所以我要直接问:

如何正确使用Authorization Services API向用户显示系统级授权窗口,与您在"系统偏好设置"中单击锁定图标时看到的窗口相同?

据我所知,如果你想以编程方式进行操作,就没有办法使用Cocoa,如果你的目标是调用通常需要调用的可执行文件sudo(在我的情况下/usr/bin/pmset),你就是一个小溪没有桨.

我挑战你,我恳求你:拜托,赐教.

谢谢.:)

c macos cocoa objective-c

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

C中的通用函数指针

我有一个函数,它接受一个数据块和块的大小和一个函数指针作为参数.然后,它迭代数据并对数据块的每个元素进行计算.以下是我正在做的事情的基本概要:

int myfunction(int* data, int size, int (*functionAsPointer)(int)){
    //walking through the data and calculating something
    for (int n = 0; n < size; n++){
        data[n] = (*function)(data[n]);
    }
}
Run Code Online (Sandbox Code Playgroud)

我作为参数传递的函数看起来像这样:

int mycalculation(int input){
    //doing some math with input
    //...
    return input;
} 
Run Code Online (Sandbox Code Playgroud)

这很好用,但现在我需要将一个额外的变量传递给我的functionpointer.顺便说一句

int mynewcalculation(int input, int someVariable){
    //e.g.
    input = input * someVariable;
    //...
    return input;
}
Run Code Online (Sandbox Code Playgroud)

是否有一种优雅的方式来实现这一目标,同时保持我的整体设计理念?

c abstraction function-pointers

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

了解printf的硬件

我想知道是否有任何可用的在线资源解释了什么事情,比如printf of C,它解释了在非常低级别发生的事情(BIOS /内核调用)

c hardware

12
推荐指数
2
解决办法
6527
查看次数

转换为void不会删除warn_unused_result错误

在测试中,我丢弃了任何东西,stderr因为它使测试用例的输出变得混乱.我正在使用以下代码:

freopen("/dev/null", "w", stderr);
Run Code Online (Sandbox Code Playgroud)

编译时-Wall -Werror,我得到错误

error: ignoring return value of ‘freopen’, declared with attribute warn_unused_result
Run Code Online (Sandbox Code Playgroud)

这是预料之中的.但是,通常的铸造解决方案void似乎不起作用.也就是说,将代码更改为

(void) freopen("/dev/null", "w", stderr);
Run Code Online (Sandbox Code Playgroud)

仍然会产生相同的警告.我不在乎这个函数是否失败,因为最坏的情况是一些额外的输出.我可以解决这个问题吗?

编辑:我知道我可以引入一个额外的不必要的变量.我真的很想知道为什么无法转换为无效.

更新: 我决定采用这个:

FILE *null = fopen("/dev/null", "w");
if (null) { fclose(stderr); stderr = null; }
Run Code Online (Sandbox Code Playgroud)

freopen仔细阅读文档之后,我看到如果打开/dev/null失败,stderr仍然会被销毁.这解决了这个问题.

c gcc gcc-warning

12
推荐指数
2
解决办法
5430
查看次数

浮点异常

我成功编写了这段代码:

#include <stdio.h>
#include <math.h>
int q;

int main()
{
    srand( time(NULL) );
    int n=3;
    q=ceil(sqrt(n));
    printf("%d\n %d\n", n,q);

    if(n == 2)
        printf("%d\n is prime", n);
    else if(n % 2 == 0.0 || n < 2)
        printf("%d\n is not prime", n);
    else
    {
        int x;
        for(x = 0; x < q; x++){
            if(n % x == 0)
            {
                printf("%d\n is not prime", n);
                return;
            }
            else
                printf("%d\n is prime", n);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但是当我运行我的代码时,我收到以下错误:

浮点异常

这个错误意味着什么,我该如何解决?

c floating-point

12
推荐指数
1
解决办法
13万
查看次数

这是宏观滥用吗?

我正在对一些代码进行逆向工程并遇到了这个......

/************************************************************************/
/*                                                                      */
/*                          MACRO CHECK_FREAD                           */
/*                                                                      */
/*  CHECK_FREAD is used to check the status of a file read.  It         */
/*   is passed the return code from read and a string to print out if   */
/*   an error is detected.  If an error is found, an error message is   */
/*   printed out and the program terminates.  This was made into a      */
/*   macro because it had to be done over and over and …
Run Code Online (Sandbox Code Playgroud)

c macros file-io coding-style

12
推荐指数
3
解决办法
1753
查看次数