Tag: 指针

通过严格解释C标准允许对可能无效的指针进行操作

原始问题 (请参阅“编辑:更新的方案”) 这个问题可能是一个或另一个方面的重复,涉及到超出范围的对象的指针的未定义行为的大量问题。但我在这里找到的所有问题主要是专门的用例。 所以我想把这个问题颠倒过来,不要问是否禁止某些事情,但是究竟允许什么? 有一个可能的场景:你有一个带有指针的函数 – 你不知道它是否来自一个(仍然)有效的对象。 在所有情况下哪些操作不是未定义的行为? 哪个可能有未指定的副作用? int * myFunc(const int * const A, int * B) { … } 编辑:更新的方案 在对问题的评论和Matt McNabbs的回答中 ,有人指出UB最有可能上升,因为在调用场景中的函数期间使用了无效指针(s值)。 因此,我会稍微改变一下场景(按照Keith Thompsons回答的例子): int *ptr = malloc(sizeof *ptr); /* the value of ptr is now valid, possibly NULL */ if (ptr != NULL) { /* the value of ptr is […]

在共享库和应用程序之间传输数据

我有共享库,我在那里进行一些数据生成/处理,我已经编写了一些API和应用程序来访问它们并传输数据。 / * ** * ** * ** * **** 申请 * ** * ** * ** / char* data1; char* data2; genratedCamData(1, char* data1 , char *data2); printf(” data1 %s “,data1); printf(” data2 %s “,data2); free(data2); / * ** * ** * ** * ** 内部图书馆 ** * ** * ** * ** * […]

指针和字符串导致分段错误

可能重复: char a [] =“string”有什么区别; 和char * p =“string”; char *str = “Hello”; printf(“%c”,++*str); 这使用gcc在linux上产生分段错误。 第一个语句改为as的那一刻 char str[10] = “Hello”; 有用。 可能是什么原因?

为什么编译器会发出“警告:赋值在没有强制转换的情况下从指针生成整数”?

我不明白为什么我在尝试编译时会遇到错误。 我说错了 fractions.c:在函数“main”中: fractions.c:35:24:警告:赋值从指针生成整数而没有强制转换[默认情况下启用] fractions.c:38:24:警告:赋值从指针生成整数而没有强制转换[默认启用] fractions.c: 41:24:警告:赋值从指针生成整数而没有强制转换[默认情况下启用] fractions.c:44:24:警告:赋值从指针生成整数而没有强制转换[默认情况下启用] fractions.c:48:11:警告:未使用的变量“fArray”[-Wunused-variable]“ #include #include typedef struct{ int numerator; int denomonator; char operator; int num2; int den2; } fraction; void printFraction(fraction f); int main(){ fraction myFraction; char input; printf(“Enter the numerator of fraction 1: “); scanf(“%i”, &myFraction.numerator); printf(“Enter the demoninator of fraction 1: “); scanf(“%i”, &myFraction.denomonator); printf(“Enter the numerator […]

C:为什么指针和指针有不同的值?

如果我在OS X上运行以下命令: int main (void) { int* n; // initialise(declare) pointer *n = 20; // the value in address pointed to by n is 20 printf(“n: %i, n&: %i\n”, n, &n); return 0; } 我明白了: n:1592302 512 ,n&:1592302 480 为什么价值观不同?

我的程序输出没有在C中更新

我有下面的c代码,它工作正常一次,再次调用该函数后,它给出了相同的结果。 缓冲区未更新。 #define _XOPEN_SOURCE #include #include #include #include char *EpochToMMDDYYYY(long ); int main() { long epoch = 1492151737; printf(“date of %ld is %s\n”,epoch,EpochToMMDDYYYY(epoch)); long ep = 1492222737; printf(“date of %ld is %s\n”,epoch,EpochToMMDDYYYY(ep)); long epc = 1491111737; printf(“date of %ld is %s\n”,epoch,EpochToMMDDYYYY(epc)); return 0; } char *EpochToMMDDYYYY(long ep) { struct tm tm; char b[25]; memset(b,0,sizeof(b)); //setenv(“TZ”, […]

我的Qsort比较函数在内存中引起奇怪的东西

为了习惯动态创建二维数组,我想创建一个可以按每个数组中的第五个成员排序的数组。 该数组是一组双打的多维数组。 每组持有五个双打。 最后两个双打是根据我写的一些随机表达式基于前三个计算的。 数组与从文件中读取的双打组数一样多。 当我写这篇文章的时候,我得到了非常随机的结果。 #include #include #include #include int getAllDoubles(char *, double ***); void printDouble(int, int, double **, char); int doubleCmp(const void *, const void *); int main(){ double **arrayAll; char *fileName = “doubles.dat”; int doublesCount = getAllDoubles(fileName, &arrayAll); printf(“%d doubles successfully copied\n”, doublesCount); printf(“As a sample, here’s #161\n”); printDouble(161, doublesCount, arrayAll, ‘a’); […]

分配char指针数组

我有一些文件,我正在将内容读入char数组,我想将我从每个文件中读取的内容存储在一个字符数组中,以便我可以访问单独的字符数组(文件内容) index,我不确定如何执行此操作的语法。 我的理解是我需要将模式数组中的每个内存地址设置为每个char数组一个内存地址; 到存储在patternData中的char数组,但我不知道如何设置它。 我错过的语法是什么,我需要让它发生? 我试过的 我原以为如果我存储了一种char*那么我需要一个char**来存储char数组的单独数组。 我将使用以下表示法来访问char* ,以将模式索引的内存地址设置为 &patterns[INDEX] = &pData; 但是这不起作用。 有很多“char指针数组”问题,但我不确定将pData简单地分配给模式索引的正确方法。 char *tData; int tLength; char *pData; int pLength; char **patterns; void ReadFromFile(FILE *f, char **data, int *length) //This is what is passed into function int main(int argc, char **argv) { for (int i = 1; i <= 5; i++) { FILE […]

检查c中的链表中是否已存在元素

假设我有一个存储book结构和下一个节点指针的链表: struct book { unsigned short size_of_content; unsigned short price; unsigned char *content; }; struct list { struct book p; struct list *next; }; 当我构建链表时,我会检查新书的价格是否与其中一本已链接的书的价格相同。 基本上确保没有重复的价格。 我有一个构建价格数组的想法,并将新价格与现有价格进行比较。 但是,由于C不支持无限大小的数组,我不认为我的方式是个好主意。 我该怎么办? 谢谢

在实际指针的副本上使用free()是可接受/正确的吗?

这是: int *a = malloc (sizeof (int) ); int *b = a; free (b); 与此相同: int *a = malloc (sizeof (int) ); free (a); 如果是,不需要解释,但如果没有,请详细说明原因!