Tag: 指针

取消引用包含对象地址(数组数组)的出界指针

对于不同的REF值,以下是否定义明确? #include #define REF 1 #define S 1 int main(void) { int a[2][S] = {{1},{2}}; int *q = REF ? a[1] : 0; int *p = a[0] + S; memcpy (&q, &p, sizeof q); printf (“q[0] = %d\n”, q[0]); return 0; } 注意, p指向a[0]的最后一个元素之后,而不指向数组a[0]的元素,因此不能解引用。 但存储在p中的地址a[1][0]的地址。 p语义(故意?)指向“到”(嗯,出) a[0] 但物理上指向a[1] 。 当原始物理上只有一个指针的位模式的副本可以在语义上指向一个对象吗? 也可以看看 我用不同的“角度”问了基本相同的C / C ++问题: […]

找出错误或错误

你能找到以下代码的错误吗? int main(){ char *p=”hai friends”,*p1; p1=p; while(*p!=’\0′) ++*p++; printf(“%s %s”,p,p1); } 我预计它将打印空格后跟一个字符串!

对malloc返回的指针进行类型转换是一种更好的做法吗?

对于下面的C代码,比较int指针a和b的定义; #include #include int main() { int *a=malloc(sizeof(int)); int *b=(int *)malloc(sizeof(int)); return(0); } 以任何方式更好地对malloc函数返回的类型为void的指针进行类型转换? 或者在分配到左侧的int指针时是自动类型化的吗? 在哪种情况下,如果有的话,它是否可以certificate是必要的而不仅仅是强制性的? 请说明隐式类型转换,右侧类型转换为左侧类型,是否适用于此处。

为Array of Structs动态分配内存

这是我正在尝试做的事情: #include #include struct myStruct { int myVar; } struct myStruct myBigList = null; void defineMyList(struct myStruct *myArray) { myStruct *myArray = malloc(10 * sizeof(myStruct)); *myArray[0] = ’42’; } int main() { defineMyList(&myBigList); } 我正在写一个简单的C程序来完成这个。 我正在使用GNU99 Xcode 5.0.1编译器。 我已经阅读了很多例子,编译器似乎不同意在哪里使用struct标签。 在sizeof()命令中使用struct引用似乎根本不识别struct 。

realloc()悬空指针和未定义的行为

当你释放内存时,指向内存的指针会发生什么? 他们立即变得无效吗? 如果他们以后再次有效会怎么样? 当然,指针变为无效然后再次变为“有效”的通常情况是将某些其他对象分配到之前使用的内存,如果使用指针访问内存,那显然是未定义的行为。 悬空指针内存覆盖了第1课,差不多。 但是,如果内存再次对同一分配有效,该怎么办? 只有一种标准方式可以实现: realloc() 。 如果你有一个指向malloc() ‘内存块中偏移量> 1某个位置的指针,那么使用realloc()将块缩小到小于你的偏移量,显然你的指针变得无效。 如果你再使用realloc()再次将块增长回至至少覆盖悬空指针指向的对象类型,并且在任何情况下都没有realloc()移动内存块,悬空指针是否再次有效? 这是一个极端的案例,我真的不知道如何解释C或C ++标准来解决它。 以下是显示它的程序。 #include #include #include int main(void) { static const char s_message[] = “hello there”; static const char s_kitty[] = “kitty”; char *string = malloc(sizeof(s_message)); if (!string) { fprintf(stderr, “malloc failed\n”); return 1; } memcpy(string, s_message, sizeof(s_message)); printf(“%p %s\n”, string, string); […]

改变函数中的指针,c

我会事先说我要问指针的指针,所以我的话可能有点模糊,但试着和我在一起:) 我试图理解更改作为参数传递的指针如何在函数范围之外生效。 到目前为止,这是我所理解的:如果指针作为参数传递给函数,我只能更改指针指向的内容,而不是指针本身(我正在谈论将在范围之外生效的更改)的function,正如我所说)。 如果我想更改指针指向的内容,我必须将指针传递给指针。 我到目前为止对吗? 另外,我注意到当我有一个包含一些指针的结构时,如果我想初始化那些指针,我必须将struct作为指针传递给初始化函数。 这是出于同样的原因吗?

C或C ++。 如何比较给出char *指针的两个字符串?

我正在以两种方式对我的汽车arrays进行排序。 一年一年,如下所示。 和另一个由make。 Make是一个char *当我指向它们时,如何比较字符串? int i, j; for(i=0; i<100; i++){ for(j=0; jyear > carArray[j+1]->year){ swap(carArray[j], carArray[j+1]); } } } } 上述方法适用于int(年)。 如何使它适用于char指针?

关于C中的字符指针

考虑这个定义: char *pmessage = “now is the time”; 在我看来,pmessage将指向包含这些字符的内存中的连续区域和末尾的’\0′ 。 所以我从中得出,只要我在这个区域的范围内,我就可以使用指针算法来访问该字符串中的单个字符。 那么为什么他们说(K&R)修改个别角色是不明确的? 此外,为什么当我运行以下代码时,我得到一个“分段错误”? *(pmessage + 1) = ‘K’;

将内存分配给双指针?

我无法理解如何为双指针分配内存。 我想读取一个字符串数组并存储它。 char **ptr; fp = fopen(“file.txt”,”r”); ptr = (char**)malloc(sizeof(char*)*50); for(int i=0; i<20; i++) { ptr[i] = (char*)malloc(sizeof(char)*50); fgets(ptr[i],50,fp); } 而不是这个我只是分配一个大的内存块并存储字符串 char **ptr; ptr = (char**)malloc(sizeof(char)*50*50); 那会错吗? 如果是这样,为什么呢?

箭头操作员与点操作员

在我看来,C的箭头操作符( – >)是不必要的。 点运算符(。)应该足够了。 请使用以下代码: typedef struct { int member; } my_type; my_type foo; my_type * bar; int val; val = foo.member; val = bar->member; 我们看到必须使用箭头运算符来取消引用条。 但是,我更愿意写 val = bar.member; 关于我是否试图从结构或指向结构的指针中拉出“成员”,没有任何歧义。 但是使用错误的运算符很容易,尤其是在重构代码时。 (例如,也许我在foo上做了一些复杂的操作,所以我将代码移动到一个新函数并将指针传递给foo)。 我认为我不需要关心foo是否是一个指针; 编译器可以担心细节。 所以问题是:从C语言中消除 – >不是更简单吗?