指针如何指向[-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],...
我试图在特定端口通过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) 现在我正在通过麻省理工学院的OpenCourseWare计算机科学课程的介绍.作为本课程的一部分,我正在学习Python语言.
我已经阅读了很多关于学习C的好处的事情.在我深入研究Python之前,我想知道我是否会因为首先学习Python而受到阻碍或帮助.
你认为我会从Python中养成任何坏习惯或类似的东西吗?
编辑:由于问题的主观性质,已更改为社区Wiki.
我很感谢第一个问题的所有重要答案.我真的被答案/评论的诚意所震撼.谢谢,很多人!
我写了这个小代码:
#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_t是unsigned 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]标签开/关切换优化,但观察结果没有任何差异.]
我一直在寻找和试验近四个小时,所以我要直接问:
如何正确使用Authorization Services API向用户显示系统级授权窗口,与您在"系统偏好设置"中单击锁定图标时看到的窗口相同?
据我所知,如果你想以编程方式进行操作,就没有办法使用Cocoa,如果你的目标是调用通常需要调用的可执行文件sudo(在我的情况下/usr/bin/pmset),你就是一个小溪没有桨.
我挑战你,我恳求你:拜托,赐教.
谢谢.:)
我有一个函数,它接受一个数据块和块的大小和一个函数指针作为参数.然后,它迭代数据并对数据块的每个元素进行计算.以下是我正在做的事情的基本概要:
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)
是否有一种优雅的方式来实现这一目标,同时保持我的整体设计理念?
我想知道是否有任何可用的在线资源解释了什么事情,比如printf of C,它解释了在非常低级别发生的事情(BIOS /内核调用)
在测试中,我丢弃了任何东西,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仍然会被销毁.这解决了这个问题.
我成功编写了这段代码:
#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)
但是当我运行我的代码时,我收到以下错误:
浮点异常
这个错误意味着什么,我该如何解决?
我正在对一些代码进行逆向工程并遇到了这个......
/************************************************************************/
/* */
/* 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 ×10
abstraction ×1
arrays ×1
c++ ×1
cocoa ×1
coding-style ×1
file-io ×1
gcc ×1
gcc-warning ×1
hardware ×1
macos ×1
macros ×1
objective-c ×1
pointers ×1
printf ×1
python ×1
python-sip ×1
sockets ×1
swig ×1
udp ×1
udpclient ×1