如何在C中指向不兼容的指针类型?

如何在C中指向不兼容的指针类型?,c,pointers,casting,C,Pointers,Casting,在《练习》一书中,有人建议通过将整数指针指向字符串数组并使用C强制转换来中断程序。我该怎么做呢?这里有一个小例子。结果取决于系统的尾数和int的大小。我希望第一个或第四个字符会更改为字母表中的下一个字符 #include<stdio.h> int main(void) { char string[100] = "Somestring"; int *p; /* Let p point to the string */ p = (int*)string;

在《练习》一书中,有人建议通过将整数指针指向字符串数组并使用C强制转换来中断程序。我该怎么做呢?

这里有一个小例子。结果取决于系统的尾数和int的大小。我希望第一个或第四个字符会更改为字母表中的下一个字符

#include<stdio.h>
int main(void) {
    char string[100] = "Somestring";
    int *p;

    /* Let p point to the string */
    p = (int*)string;

    /* modify a value */
    (*p)++;

    /* Let's see if any character got changed */ 
    printf("%s", string);

    return 0;
}
我们可以使用

char *string = malloc(100);
strcpy(string, "Somestring");
随后的强制转换现在可以安全对齐,并且可以移植到int小于100的系统

请注意,malloc是在stdlib.h中声明的,因此我们应该在代码文件的顶部添加以下内容:

#include<stdlib.h>

这里有一个小例子。结果取决于系统的尾数和int的大小。我希望第一个或第四个字符会更改为字母表中的下一个字符

#include<stdio.h>
int main(void) {
    char string[100] = "Somestring";
    int *p;

    /* Let p point to the string */
    p = (int*)string;

    /* modify a value */
    (*p)++;

    /* Let's see if any character got changed */ 
    printf("%s", string);

    return 0;
}
我们可以使用

char *string = malloc(100);
strcpy(string, "Somestring");
随后的强制转换现在可以安全对齐,并且可以移植到int小于100的系统

请注意,malloc是在stdlib.h中声明的,因此我们应该在代码文件的顶部添加以下内容:

#include<stdlib.h>

那只是一种滥用的施展方式

// setup the pointers to the start of the arrays
int *cur_age = ages;
char **cur_name = names;
该链接的作者的意思是通过将整数指针指向字符串数组并使用C强制转换来中断程序。他的意思是你可以写像这样的名字;也就是说,将指向char的指针转换为指向int的指针。您可以在C中这样做,这允许您从一种类型的指针转换为另一种类型的指针;但是请注意,你需要知道你在做什么


在这里,作者想展示如何通过将指针指向错误的类型来中断程序。然而,他的例子可能会让你更加困惑,而不是帮助你理解指针。

这只是一种滥用的施法方式

// setup the pointers to the start of the arrays
int *cur_age = ages;
char **cur_name = names;
该链接的作者的意思是通过将整数指针指向字符串数组并使用C强制转换来中断程序。他的意思是你可以写像这样的名字;也就是说,将指向char的指针转换为指向int的指针。您可以在C中这样做,这允许您从一种类型的指针转换为另一种类型的指针;但是请注意,你需要知道你在做什么


在这里,作者想展示如何通过将指针指向错误的类型来中断程序。然而,他的例子可能会让您更加困惑,而不是帮助您理解指针。

要转换,请使用转换运算符:typeexpression。例如,要将double类型的表达式强制转换为int:

在您的特定情况下,将名称强制转换为int*要中断程序的电流类型:

cur_age = (int*)names;

要强制转换,请使用强制转换运算符:typeexpression。例如,要将double类型的表达式强制转换为int:

在您的特定情况下,将名称强制转换为int*要中断程序的电流类型:

cur_age = (int*)names;

要在c中指向不兼容的指针,只需将其强制转换为void

//array of string declaration
char aStr[50][50];
Int *pint;

//do whatever you need with string array

pint = (*int)(*void)aStr;
我在用手机写这封信


如果指针的增量超过分配的内存,则可能会出现在程序堆栈中并更改其值。

要在c中指向不兼容的指针,只需将其强制转换为void

//array of string declaration
char aStr[50][50];
Int *pint;

//do whatever you need with string array

pint = (*int)(*void)aStr;
我在用手机写这封信



如果指针的增量超过分配的内存,则可能会出现在程序堆栈中,并将值更改为它。

为什么要这样做?您已经说过如何“使用C case”。你的问题是什么?@ FuZXXL,我是C的初学者,所以我不知道如何用铸造类型来做。@奥古斯塔卡洛斯特罗姆在每一个章节中都有一个章节,在这里你可以找到一些建议来打破程序,并愿意编写编译器错误。C编译器从不在错误中给出错误,也许C++编译器会给它带来什么,这取决于编译器为什么要这么做。你想这样做吗?你已经说过如何“使用C case”了。你的问题是什么?@ FuZXXL,我是C的初学者,所以我不知道如何用铸造类型来做。@奥古斯塔卡洛斯特罗姆在每一个章节中都有一个章节,在这里你可以找到一些建议来打破程序,并愿意编译错误。C编译器从不在C++中出错,C++编译器会让它依赖于编译器。甚至可能在某些硬件上崩溃,其中对齐约束与x86无关。@BasileStrynkevitch这是OP正在阅读的练习的重点-他只是询问执行此操作的特定语法。@BasileStrynkevitch我添加了两段关于强制转换的危险性的内容。我相信这也打破了严格的别名规则。你可以从一种类型到另一种角色,反之亦然。这甚至可能会在某些硬件上崩溃,其中对齐约束与x86无关。@BasileStrynkevitch这是OP正在阅读的练习的重点-他只是询问执行此操作的特定语法。@BasileStrynkevitch我添加了几段关于强制转换的危险性的内容。我相信这也打破了严格的别名规则。你可以从一种类型转换到另一种类型,而不是相反 这会违反,这会违反。