Tag: 指针

不使用strtok()的字符串标记生成器

我正在编写字符串标记器而不使用strtok()。 这主要是为了我自己的改进和对指针的更好理解。 我想我几乎拥有它,但我一直收到以下错误: myToc.c:25 warning: assignment makes integer from pointer without a cast myToc.c:35 (same as above) myToc.c:44 error: invalid type argument of ‘unary *’ (have ‘int’) 我正在做的是循环发送到方法的字符串,找到每个分隔符,并用’\ 0’替换它。 “ptr”数组应该具有指向分离的子串的指针。 这就是我到目前为止所拥有的。 #include void myToc(char * str){ int spcCount = 0; int ptrIndex = 0; int n = strlen(str); for(int i = 0; i < n; […]

为什么scanf(“%s”,&str); 表现为scanf(“%s”,str);?

看下面的代码: #include int main() { char str[80]; int n; scanf(“%s%n”,str,&n); printf(“%s\t%d”,str,n); putchar(‘\n’); getchar(); //to remove ‘\n’ scanf(“%s%n”,&str,&n); printf(“%s\t%d”,str,n); return 0; } 这是输入和输出: abc abc 3 123 123 3 我们知道, scanf是一个可变参数函数,因此在调用它时它的参数不会被强制转换。 因此,参数必须以与它们应该完全相同的类型传递。 但是, str的类型是char * (从char (*)[80]衰减),而&str的类型为char (*)[80] ,尽管它们具有相同的值 ,即&str[0] 。 那么为什么scanf(“%s”,&str); 正确工作而不会因指针运算而导致段错误?

指向数组的指针和指针指针有什么区别?

我是编程和学习数组指针的新手。 我现在有点困惑。 看看下面的程序: #include int fun(); int main() { int num[3][3]={23,32,478,55,0,56,25,13, 80}; printf(“%d\n”,*(*(num+0)+1)); fun(num); printf(“%d\n”, *(*(num+0)+1)); *(*(num+0)+0)=23; printf(“%d\n”,*(*(num+0))); return 0; } int fun(*p) // Compilation error { *(p+0)=0; return 0; } 这是我老师的笔记中写的程序。 在main()函数中,在printf()函数中,dereference运算符被使用了两次,因为num是指向数组的指针,因此第一次取消引用运算符将​​指向int ,然后第二个将给出指针所在的值指向。 我的问题是,当我将数组名称作为参数传递给函数fun()为什么使用*p ; 为什么不**p作为num是指向数组的指针? 第二件事为什么*(p+0)用于改变数组的第0个元素的值; 为什么不*(*(p+0)+0)=0因为main()函数*(*(num+0)+0)用于改变第0个元素的值? 整件事对我来说很困惑,但无论如何我必须要理解它。 我已经搜索了这个,发现指向数组的指针和指向指针之间有区别,但我无法理解。

不同类型指针之间的减法

我试图找到两个变量之间的内存距离。 具体来说,我需要找到char []数组和int之间的距离。 char data[5]; int a = 0; printf(“%p\n%p\n”, &data[5], &a); long int distance = &a – &data[5]; printf(“%ld\n”, distance); 当我在没有最后两行的情况下运行我的程序时,我得到了两个变量的正确内存地址,如下所示: 0x7fff5661aac7 0x7fff5661aacc 现在我明白了,如果我没错,两者之间有5个字节的距离(0x7fff5661aac8,0x7fff5661aac9,0x7fff5661aaca,0x7fff5661aacb,0x7fff5661aacc)。 为什么我不能减去类型(int *)和类型(char *)之一的指针。 两者都是指内存地址..我该怎么做才能计算两者之间的距离,以字节为单位? 我尝试了两个指针中的一个,但它不起作用。 我得到:“ 错误:’char *’和’int *’不是兼容类型的指针 ”。 谢谢大家都会帮助我

将从C例程分配的数组传递给ADA

将结构/记录数组从ADA传递到C例程是一回事。 在这种情况下,内存管理在ADA中完成。 但是当与第三方库连接时,通常存在内存管理在C部分中完成的问题。 例如:对于C结构: typedef struct _MYREC { int n; char *str; } MYREC; 以下C-routine分配Memory并返回一个指向带有n个元素的MYREC数组的指针: MYREC * allocMyrec(int n); 问题是返回的指针不包含ADA中内存安全计算所需的大小信息。 在ADA中我想对(MYREC *)指针使用相应的Array-Definition: type MYREC_Array is array (Int range ) of aliased MYREC; pragma Convention (C, MYREC_Array); 相应的(大小很大的)ADA-Function allocMyrec会是什么样子或者什么是正确的策略? 对于一个元素,可以映射C指针以access MYREC 。 这就是Gnat-Binding生成器的function。 但这没有用。 提示高度赞赏。

在C中进行文本查找的通用枚举

[更新] 给出的代码确实有效。 当我认为它没有时,我错了。 我的错; 遗憾++。 如果您可以改进代码,请访问https://codereview.stackexchange.com/questions/150480/generic-enum-to-text-lookup-in-c 我们必须在编译时声明我们的字符串。 我们对嵌入式系统进行编码,不允许使用malloc() 。 很抱歉没有这么清楚。 [更新++]我可能会接受下面的答案之一。 然而,我忘了说,我们的枚举是不连续的,并且范围很广,这可以有所作为 intertubes和这个网站充斥着要求从枚举中获取文本的问题。 我找不到一个规范的方法来做这个(并且会接受一个作为这个问题的答案),所以让我们看看我们是否可以在我们之间拼凑一个。 在我们的代码中,我们有多个结构数组,包含枚举对应和相应的字符串。 问题是字符串具有不同的长度,因此我们为每个字符串编写一个查找函数,用于在结构数组上循环,尝试匹配枚举并在找到匹配时返回相应的文本。 让我们采取以下两个人为的例子: // +=+=+=+=+=+=+=+=+=+=+=+=+=+= typedef enum { north, south, east, west } E_directions; struct direction_datum { E_directions direction; char direction_name[6]; }; struct direction_datum direction_data[] = { {north, “north”}, {south, “south”}, {east, “east”}, {west, “west”}, }; // +=+=+=+=+=+=+=+=+=+=+=+=+=+= typedef enum { […]

使用C数组的哪种数据组织可以生成最快的代码?为什么?

根据以下数据,组织元素数组的最佳方法是什么,以便最快的随机访问? 每个元素都有一些int数,一个名称为3个字符,末尾带有’\ 0’,浮点值 。 我看到两种可能的方法来组织和访问这样的数组: 第一: typedef struct { int num; char name[4]; float val; } t_Element; t_Element array[900000000]; //random access: num = array[i].num; name = array[i].name; val = array[i].val; //sequential access: some_cycle: num = array[i].num i++; 第二: #define NUMS 0 #define NAMES 1 #define VALS 2 #define SIZE (VALS+1) int array[SIZE][900000000]; //random access: num […]

GCC错误:二进制+的操作数无效

为什么GCC给我这个错误? 我在这做错了什么? temp.c: In function main: temp.c:6: error: invalid operands to binary + 码: main() { char *Address1,*Address2,*NewAddress; Address1= (char*)0x12; Address2= (char*)0x34; NewAddress = Address1+Address2; }

关于*(星号)和++中的++的混淆

int main() { int a=10; int *b=&a; int c=*b++; printf(“%d”,c); } 我知道以下程序输出10.但是根据优先级表给出了运算符http://www.difranco.net/compsci/C_Operator_Precedence_Table.htm的优先级,post-fix ++的优先级高于=和* .so ++应该首先评估,然后*。然后为什么程序打印输出为10?

strcpy()和字符串数组

我需要将用户的输入存储到字符串数组中。 #include #include #include char *history[10] = {0}; int main (void) { char input[256]; input = “input”; strcpy(history[0], input); return (EXIT_SUCCESS); } 在终端上运行它我得到一个分段错误,在NetBeans中我得到main.c:11:错误:赋值中不兼容的类型。 我还尝试将所有历史记录移动到最新输入到第一个位置(历史[0])。 history[9] = history[8]; history[8] = history[7]; history[7] = history[6]; history[6] = history[5]; history[5] = history[4]; history[4] = history[3]; history[3] = history[2]; history[2] = history[1]; history[1] = history[0]; history[0] = input; 但这导致这样的输出。 […]