Tag: 数组

用户定义的数组元素和C中的数组大小

我是C编程的新手,我自己学习。 我想编写一个代码,要求用户输入一些数字并将它们存储到数组中。 如果用户输入“q”,程序将停止。 然后它应该打印数组并告诉用户该数组中有多少个数字。 (长度) 我写了下面的代码,但如果我留下int array []; 空的,它不起作用(显然)。 我无法定义它,因为它取决于用户输入的数量…我通过互联网搜索了很多并遇到了malloc和calloc。 我试着在这里使用它们,但老实说我不知道​​如何,我现在坐在这段代码上几天了。 #include #include int main() { int array[]; //I want to leave this empty but C doesn’t allow me to. int len=sizeof(array)/sizeof(array[0]); for(int a=0;a<len;a++) { printf("Enter element %d: ", a); scanf("%d",&array[a]); if(getchar()=='q') break; } printf("Array: ["); for(int a=0;a<len-1;a++) { printf("%d, ", array[a]); } printf("%d]", array[len]); […]

是否可以对char数组进行位掩码

假设我有以下char数组 char array[32]; 我想只使用此数组的10个最高有效位作为哈希值。 是否可以对此char数组使用按位运算? 如果是这样,我该怎么办?

c char 到jstring printf适用于int类型但不适用于字符串

我们有供应商提供的api,其结构定义为 typedef struct { char duo_word[8]; } duo_word; 他们向我们发送了这个结构中的数据,然后我们必须通过jni传递给我们的java应用程序。 printf(“Number: : %i\n”, duo_word_inst); 打印正确的int值,例如52932,但是 printf(“Number: : %s\n”, duo_word_inst); 没有打印。 更重要的是,如果我在我的java进程下面使用jni代码接收乱码。 jstring jstrBuf = (*env)->NewStringUTF(env, (char*)(duo_word_inst)); (*env)->SetObjectField(env, *ret_obj, fld_id, jstrBuf); 发送乱码给java例如ÄÎ // I have got some example data captured from VS debugger below. duo_word duo_word_inst = { .duo_word = { ‘º’, ‘\b’, ‘\x1’, ‘\0’, ‘À’, ‘\xe’, […]

有关char数组的struct的问题

下面是我的代码片段 struct encode { char code[MAX]; }a[10]; int main() { char x[]={‘3′,’0′,’2′,’5′,’9′,’3′,’1’}; for(i=0;i<1;i++) { printf("%c",x[i]); //This will printout like 3025931 now I want this to be stored in structure. } strcpy(a[0].code,x); // or a[0].code=x;//neither works display(); } void display() { printf("%c",a[0].code); } 我希望输出像:3025931。 由于不兼容的分配类型,我没有得到。 请告诉我哪里出错了。

C99中隐含的函数声明无效

我是C语言的新手,我遇到了一个我真的不明白的问题。 我试图从另一个函数获取一个数组但是当我尝试提取信息时,它给了我以下警告: 函数’getk_vector_calculation’的隐式声明在C99中无效。数组初始值设定项必须是初始化列表或字符串文字 这是代码: int k_vector_calculation(int krec[3]) { … krec [0] = l*u[0]+m*v[0]+o*[0] ; krec [1] = l*u[1]+m*v[1]+o*[1] ; krec [2] = l*u[2]+m*v[2]+o*[2] ; return k_vector_calculation( &krec[3] ) } int main () { char krec[3] = getk_vector_calculation(&krec[3]); … }

这是使用数组未定义的行为吗?

在我发布的解决方案中,我得到的评论是解决方案包含未定义的行为。 但是,我不知道怎么做。 发布的解决方案的基础是: typedef struct { int n; int a[1]; } t_x; void example(void) { int i; t_x *t= malloc (sizeof(t_x) + 99*sizeof(int)); t->n= 100; for (i=0; i n; i++) t->a[i]= i; free(t); } UB的注释集中在数组现在是否有1个元素(如声明的)或有100个元素(分配)。 引用标准的部分是6.5.6(指针/ int添加)和6.5.2.1(数组下标) “6.5.6定义了添加指针和整数时发生的情况。结果指针指向数组的相应元素( 如果存在这样的元素) ,或指向结束后的一个元素。否则结果是未定义的。” “6.5.2.1定义a[n]在a+n含义。如果a不具有至少n+1元素,则不能说a[n] 。” 对于这两个引用,评论者似乎暗示元素a[99]不存在,但是,看着内存布局它显然存在: 请帮助我理解是否/为什么这是UB以及我可能期望的UB类型。

内存布局:2D N * M数据作为指向N * M缓冲区的指针或作为指向数组的N指针数组

我对如何组织2D数据的内存布局犹豫不决。 基本上,我想要的是N * M 2D doublearrays,其中N~M是数千(并且来自用户提供的数据) 我看到它的方式,我有两个选择: double *data = new double[N*M]; 要么 double **data = new double*[N]; for (size_t i = 0; i < N; ++i) data[i] = new double[M]; 第一个选择是我倾向于。 我看到的主要优点是更短的新/删除语法,如果我正确安排访问,连续内存布局意味着在运行时相邻内存访问,并且可能更好地实现矢量化代码(自动矢量化或使用矢量库,如vDSP或vecLib) 另一方面,在我看来,与分配一堆较小的连续内存相比,分配大量连续内存可能会失败/花费更多时间。 并且第二种方法还具有与data[i*M+j]相比较短的语法data[i][j]的优点 最常见/更好的方法是什么,主要是如果我尝试从性能角度来看它(尽管那些将是小改进,我很好奇看哪哪个会更好)。

将8字节char数组转换为long

我们如何将8字节的char数组转换为long,因为<<不适用于long类型? #define word_size 8 long num = 0; char a[word_size] = “\x88\x99\xaa\x0bb\xcc\xdd\xee\xff”; for (i=0; i < word_size;i++) { a[(word_size-1) – i] |= (num << (8*(word_size – i – 1))) & 0xFF; } printf("%lx\n", num);

为什么我没有得到SIGSEGV?

我想了解这里发生了什么,更准确地说,为什么我在写入内存位置时没有收到分段错误,根据我的理解,没有分配。 假设我想定义一个int的二维数组( testptr )。 一维( 4 )静态分配(作为“数组”),第二维( 2 )动态分配(作为“指针”)。 // First dimension 4 rows static int *testptr[4]; for (i=0; i<4; i++) testptr[i] = calloc(2, sizeof(int)); // Second dimension 2 columns "dynamically" (in this example it is really just a constant) 现在我写信给一些地方: testptr[0][0] = 5; testptr[1][0] = 6; testptr[2][1] = 7; testptr[3][1] = 7; 以上所有我希望工作正常,因为它们在4×2“arrays”内。 现在我写一个不应该分配的位置: […]

局部变长数组

在C ++中的一些代码重构期间,我遇到了以下局部变量长度数组 void some_function(uint8_t length, uint8_t id, uint8_t * bytes)) { uint8_t string[length + 8]; //some transformation on string [1-8] elements do_something(string); } 我不熟悉C99,但是使用可变长度数组大小[x + y]看起来像将放在堆中。 此外,我调试此函数,以确保此“字符串”变量放在堆上,它是。 在C中,局部变量不能是固定大小,因此在使用它们之后不需要清理它们。 但是这里我们有固定大小的数组而没有内存分配,所以不需要在这个变量之后清理,但是GCC编译器如何管理这个内存? 或者也许以其他方式澄清我在这里考虑的内容:长度变量来自外部IO所以在我看来可能存在安全问题(例如当长度为INTEGER_MAX值时),除了检查长度大小还有其他什么行动可以这里有安全代码吗? 或者它可能已经安全了?