我正在从学习C The Hard Way中刷出我的C技能,目前我正在进行第17次练习 。 我正在做“额外积分”部分。 使该页面上给出的数据库代码得到我正在尝试 “更改代码以接受MAX_DATA和MAX_ROWS的参数,将它们存储在Database结构中,并将其写入文件,从而创建一个可以任意resize的数据库” 所以,我注释掉#define指令,并更改了给定的地址和数据库结构: struct Address { int id; int set; char *name; char *email; }; struct Database { int MAX_DATA; int MAX_ROWS; struct Address *rows; }; 这样,我可以从用户那里获得MAX_DATA和MAX_ROWS参数,以根据自己的喜好创建数据库。 我在代码中更改的其他内容是 – Database_create函数: void Database_create(struct Connection *conn, int MAX_DATA, int MAX_ROWS) { int i = 0; conn->db->MAX_DATA = MAX_DATA; conn->db->MAX_ROWS = MAX_ROWS; […]
我维护一个用C语言编写的库,用户可以在Linux上直接从Python使用加载共享库和调用函数的模块访问。 该模块是非常常用的,正如这个版本的共享库一样,人们在做一个流行的教程 。 用户正在获得分段错误。 在gdb下运行他的Python脚本,他发现它位于共享库中,在一个函数内,为一个结构的mallocs内存并返回指针。 他正在返回指针,但当他尝试在后续调用共享库时使用它时,会发生分段错误,因为内存不可访问。 如果他以root身份运行Python脚本,则不会发生此问题。 它也不会出现在备用Linux安装中。 所以回顾一下: 他的Python代码加载了共享库。 然后它调用一个函数,该函数返回指向共享库中分配的内存的指针。 然后他调用共享库中的另一个函数,并传入它返回给他的指针,共享库扼杀它自己的指针。 它只发生在“4.0.7-2-ARCH x86_64 GNU / Linux”上作为普通用户运行时。 当他切换到root并运行它时,该操作系统上不会发生这种情况。 当他试图在Ubuntu机器上重现问题时不会发生这种情况。 是什么赋予了? 这是一些ARCH错误吗? 或者是否存在可以清除的编程细微差别? 您可以在这里阅读细节,其中包含足够的细节来重现问题,如果问题对于具有比我更多Linux编程经验的用户来说不是不言而喻的。 指向共享库函数的快速链接: TCOD_map_new的源代码。 TCOD_map_set_properties的源代码。 他的Python代码摘录为后代和易于访问: #!/usr/bin/env python2 import curses import libtcodpy as libtcod def main(stdscr): curses.start_color() curses.use_default_colors() map = libtcod.map_new(10, 10) # any numbers work libtcod.map_set_properties(map, 0, 0, True, True) # any in […]
我正在努力处理C,因为我通过Jim Trevor的“ 旋风:C语言的安全方言 ”为PL课程工作。 特雷弗和他的合着者正试图制作一个安全的C版本,因此他们用他们的语言消除了未初始化的指针。 在未初始化的指针上搜索一下 ,似乎未初始化的指针指向内存中的随机位置。 似乎这一点使它们不安全。 如果引用非itilialized指针,则跳转到内存的不安全部分。 期。 但特雷弗谈论它们的方式似乎暗示它更复杂。 他引用了下面的代码,并解释说当函数FrmGetObjectIndex取消引用f时,它不是访问有效指针,而是访问一个不可预测的地址 – 当分配f的空间时堆栈上的任何内容。 什么是Trevor的意思是“当f的空间分配时,堆栈中的任何东西”? 默认情况下,“未初始化”指针是否已初始化为内存中的随机位置? 或者他们的“随机”行为是否与为这些指针分配的内存有关,因为堆栈上的意外行为会填充奇怪的值(然后被引用)。 Form *f; switch (event->eType) { case frmOpenEvent: f = FrmGetActiveForm(); … case ctlSelectEvent: i = FrmGetObjectIndex(f, field); … }
我的理解是,一旦指针初始化为字符串常量,就不能修改字符串。 我尝试过执行修改,程序崩溃了。 该理论在Brian W. Kernighan和Dennis M. Ritchie的C编程语言的第5.5章“字符指针和函数”中给出。 但是,有一个在数组中存储指针的例子(第5.6章),其中指针的内容被修改。 该计划如下: #include #include #define MAXLINES 5000 /* max #lines to be sorted */ #define MAXLEN 1000 char *lineptr[MAXLINES]; /* pointers to text lines */ char *alloc(int); int readlines(char *lineptr[], int nlines); int getline(char *, int); void writelines(char *lineptr[], int nlines); main() { int nlines; /* number of […]
我想知道在struct中使用enum的语法( 在C ) 我已经看过各种例子,其中使用struct + union / enum组合来创建复杂类型,例如: struct MyStruct{ enum{ TYPE_1, TYPE_2, TYPE_3, } type; union{ int value_1; int value_2; int value_3; } value; }; // … struct MyStruct test_struct; 无论如何,从这个例子中,我如何根据enum字段存储/测试当前的“类型”? 如果我有一个指向test_struct的指针,这似乎不起作用; 踢回未知成员错误: struct MyStruct *test_pointer = &test_struct; test_pointer->value = test_pointer->VALUE_1; 我只是好奇,我需要将enum值作为全局值来访问吗? test_pointer->value = VALUE_1; 任何澄清将不胜感激。
当没有提到2D数组的行时,编译器声明“从不兼容的指针类型赋值”,我一直认为没有括号的数组意味着第一个元素的地址,在这种情况下是元素的地址twodstring [0] [0] 当提到行时,编译器没有说出错误,我想知道为什么会这样? #include int main() { char onedstring[]={“1D Array”}; char twodstring[][5]={“2D”,”Array”}; char *p1,*p2; p1=onedstring; p2=twodstring; p2=twodstring[1]; }
可能重复: C中的指针算法 码: int main() { int a[ ] ={0,1,2,3,4}; char c[ ] = {‘s’,’a’,’n’,’j’,’u’}; printf(“%d\n”,&a[3]-&a[0]); printf(“%d\n”,&c[3]-&c[0]); return 0; } 为什么两者的输出都是3 3,如果我们考虑地址的差异,两者都会有所不同?
从C编程中度过了夏天之后,我又重新回到了课程中,并且正在努力追赶,特别是在指针方面。 当前的赋值让我们将程序从数组结构转换为简单的链表。 为了刷新我的记忆,我尝试在一个独立程序中实现它,但遇到了麻烦。 我的代码: struct node{ int val; struct node *next; }; typedef struct node *item; item newNode(void); //function prototype void main(){ item *cur, *itemList; int i; itemList=NULL; for (i=0; ival=i; cur->next= itemList; } } item newNode(void) { item box; /* the new object to return */ box = (item) malloc (sizeof (struct node)); if […]
int i=10; printf(“Address of i = %u”,&i); Output: Address if i = 3220204848 Output on re-execution: Address of i = 3216532594 每次执行程序时, i都会得到一个新的地址。 这意味着什么?
我有一个问题,我看到两个指针的地址在这里是相同的( 两个指针的地址是相同的 ),也由蓝色月亮回答。 这让我更加怀疑。 由于两个指针都有相同的地址,我想改变其中一个指针的值,期望值也会在其他指针中改变(因为它们具有相同的地址)。 但它给出了分段错误。 我在下面的代码中显示它。 #include #include int main() { char * p = “abc”; char * p1 = “abc”; printf(“%d\n %d\n”, (void *)p, (void *)p1); printf(“%s\n %s\n”, p, p1); *p = ‘b’; printf(“%d\n %d\n”, p, p1); printf(“%s\n %s\n”, p, p1); }